Java8 到 Java7 - 迁移比较器
Java8 to Java7 - Migrate Comparators
我无法理解如何 "migrate" Java7 中的简单比较器。
我在 Java8 中使用的实际版本如下:
private static final Comparator<Entry> ENTRY_COMPARATOR = Comparator.comparing(new Function<Entry, EntryType>() {
@Override
public EntryType apply(Entry t) {
return t.type;
}
})
.thenComparing(Comparator.comparingLong(new ToLongFunction<Entry>() {
@Override
public long applyAsLong(Entry value) {
return value.count;
}
}).reversed());
但是在构建阶段我得到这个错误:
static interface method invocations are not supported in -source 7
如何将同一个比较器迁移到 Java7?我正在谷歌搜索并寻找解决方案,但我唯一能想到的就是实现我自己的 class 作为 Comparator 接口实现。
但是如果我走那条路,我如何在同一个 "compare" 方法中同时应用 "comparing"、"then comparing" 和 "reverse"?
提前致谢
您可以在单个 compare
方法中编写逻辑:
public int compare (Entry one,Entry two) {
int result = two.getType().compareTo(one.getType());
if (result == 0) {
result = Long.compare(two.getCount(),one.getCount());
}
return result;
}
请注意,通过交换比较的 Entry
个实例的顺序来实现相反的顺序。
甚至您的 java-8 版本也可以变得更短更易于阅读:
Comparator.comparing(Entry::getType)
.thenComparingLong(Entry::getCount)
.reversed();
使用 guava
(java-7 兼容),这看起来有点冗长:
@Override
public int compare(Entry left, Entry right) {
return ComparisonChain.start()
.compare(left.getType(), right.getCount(), Ordering.natural().reversed())
.compare(left.getCount(), right.getCount(), Ordering.natural().reversed())
.result();
}
您可以构造一个 Comparator<Entry>
java 7 方法,之后,您可以像在 java 8 中那样链接默认方法,但不使用 lambda 表达式或方法引用作为参数:
private static final Comparator<Entry> ENTRY_COMPARATOR = new Comparator<Entry>() {
@Override
public int compare(Entry left, Entry right) {
return left.type.compareTo(right.type);
}
}
.thenComparingLong(new ToLongFunction<Entry>() {
@Override
public long applyAsLong(Entry entry) {
return entry.value;
}
})
.reversed();
上面的代码是用-source 1.7
编译的。
我无法理解如何 "migrate" Java7 中的简单比较器。
我在 Java8 中使用的实际版本如下:
private static final Comparator<Entry> ENTRY_COMPARATOR = Comparator.comparing(new Function<Entry, EntryType>() {
@Override
public EntryType apply(Entry t) {
return t.type;
}
})
.thenComparing(Comparator.comparingLong(new ToLongFunction<Entry>() {
@Override
public long applyAsLong(Entry value) {
return value.count;
}
}).reversed());
但是在构建阶段我得到这个错误:
static interface method invocations are not supported in -source 7
如何将同一个比较器迁移到 Java7?我正在谷歌搜索并寻找解决方案,但我唯一能想到的就是实现我自己的 class 作为 Comparator 接口实现。
但是如果我走那条路,我如何在同一个 "compare" 方法中同时应用 "comparing"、"then comparing" 和 "reverse"?
提前致谢
您可以在单个 compare
方法中编写逻辑:
public int compare (Entry one,Entry two) {
int result = two.getType().compareTo(one.getType());
if (result == 0) {
result = Long.compare(two.getCount(),one.getCount());
}
return result;
}
请注意,通过交换比较的 Entry
个实例的顺序来实现相反的顺序。
甚至您的 java-8 版本也可以变得更短更易于阅读:
Comparator.comparing(Entry::getType)
.thenComparingLong(Entry::getCount)
.reversed();
使用 guava
(java-7 兼容),这看起来有点冗长:
@Override
public int compare(Entry left, Entry right) {
return ComparisonChain.start()
.compare(left.getType(), right.getCount(), Ordering.natural().reversed())
.compare(left.getCount(), right.getCount(), Ordering.natural().reversed())
.result();
}
您可以构造一个 Comparator<Entry>
java 7 方法,之后,您可以像在 java 8 中那样链接默认方法,但不使用 lambda 表达式或方法引用作为参数:
private static final Comparator<Entry> ENTRY_COMPARATOR = new Comparator<Entry>() {
@Override
public int compare(Entry left, Entry right) {
return left.type.compareTo(right.type);
}
}
.thenComparingLong(new ToLongFunction<Entry>() {
@Override
public long applyAsLong(Entry entry) {
return entry.value;
}
})
.reversed();
上面的代码是用-source 1.7
编译的。