请帮助我处理Java 8映射-过滤-排序-收集代码。
Info.java
public class Info {
private final String name;
private final String desc;
private String version = null;
@Override
public boolean equals(Object that) {
if (that == null) {
return false;
}
if (that instanceof Info) {
Info other = (Info) that;
return Objects.equals(this.name, other.name) &&
Objects.equals(this.desc, other.desc) &&
Objects.equals(this.version, other.version);
} else {
return false;
}
}
public boolean equalsWithoutVersion(Object that) {
if (that == null) {
return false;
}
if (that instanceof Info) {
Info other = (Info) that;
return Objects.equals(this.name, other.name) &&
Objects.equals(this.desc, other.desc);
} else {
return false;
}
}
@Override
public int hashCode() {
int hash = 13;
hash = (hash * 7) + name.hashCode();
hash = (hash * 7) + desc.hashCode();
if (version != null)
hash = (hash * 7) + version.hashCode();
return hash;
}
@Override
public String toString() {
String versionString = version == null ? "latest" : version;
return String.format("Name: %s Desc: %s Key Type: %s Version: %s", this.name, this.desc, this.keyType.name(), versionString);
}
}
Value.java
public class Value implements Comparable<Value> {
private String data;
private String version;
public Value(String version, String data) {
this.version = version;
this.data = data;
}
@Override
public int compareTo(Value o) {
return (Integer.parseInt(this.version) > Integer.parseInt(o.version)) ? -1
: (Integer.parseInt(this.version) < Integer.parseInt(o.version)) ? 1
: 0;
}
}
Cache.java
public class Cache {
private final Map<Info, Value> dataMap = new HashMap<>();
...
private Value getlatestVersionFromCache(Info info) {
List<Value> values = dataMap.entrySet().stream()
.filter(p -> p.getKey().equalsWithoutVersion(info))
.sorted(Map.Entry.comparingByValue())
.map(x::getValue))
.collect(Collectors.toList());
return values.isEmpty() ? null : values.get(0);
}
}
目标是从地图上获取记录的最新版本。因此,我首先通过比较Info
的字段(没有版本)来过滤地图中的条目。然后,我将根据版本根据值对地图进行排序。然后,我将这些值收集到列表中。然后,我可以获取第一个元素来获取最新版本。
但是我在filter语句中收到以下编译错误:
Syntax error on token ")", ElidedSemicolonAndRightBrace expected
答案 0 :(得分:1)
您在发布的代码中存在一些遗漏和错误,但是filter
语句实际上没问题。
以下通过编译:
List<Value> values = dataMap.entrySet()
.stream()
.filter(p -> p.getKey().equalsWithoutVersion(info))
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getValue) // was .map(x::getValue)) - x is not defined anywhere, so
// I assumed you meant Map.Entry::getValue
.collect(Collectors.toList());
答案 1 :(得分:1)
我怀疑您的解决方案。我认为您可以通过简单的方式来实现。因此,首先在version
类中将Integer
类型更改为Value
(在compareTo()方法中,将其转换为Integer )。并在Optional<Value>
方法中将方法签名更改为getlatestVersionFromCache()
。
我还认为您不需要对dataMap
进行排序。
private Optional<Value> getlatestVersionFromCache(Info info) {
Map<Value,Integer> result = dataMap.entrySet()
.stream()
.filter(p -> p.getKey().equalsWithoutVersion(info))
.collect(Collectors.toMap(Map.Entry::getValue, entry -> entry.getValue().getVersion(), Integer::min));
Optional<Value> latestValue = result.keySet()
.stream()
.min(Comparator.comparingInt(key -> key.getVersion()));
return latestValue;
}
更好的解决方案是这样的:
dataMap.entrySet()
.stream()
.filter(p -> p.getKey().equalsWithoutVersion(info))
.min(Comparator.comparingInt(entry -> entry.getValue().getVersion()))
.map(Map.Entry::getValue)
.orElse(null);
答案 2 :(得分:0)
class Info {
public static final BiPredicate<Info, Info> IS_EQUAL_IGNORE_VERSION =
(one, two) -> one.getName().equals(two.getName()) && one.getDesc().equals(two.getDesc());
private final String name;
private final String desc;
private String version;
}
private final Map<Info, Value> dataMap = new HashMap<>();
public Value getlatestVersionFromCache(Info info) {
Value value = null;
for (Map.Entry<Info, Value> entry : dataMap.entrySet())
if (Info.IS_EQUAL_IGNORE_VERSION.test(entry.getKey(), info))
if (value == null || Integer.parseInt(entry.getValue().getVersion()) > Integer.parseInt(value.getVersion()))
value = entry.getValue();
return value;
}
注意:
Predicate
。并将其定义为目标类中的静态方法。version
。似乎应该是整数而不是String。equals
方法。Java8
流还是不正确的。