Java 8 Java8到Java7-迁移比较器
我很难理解如何在Java7中“迁移”一个简单的比较器 我在Java8中使用的实际版本如下:Java 8 Java8到Java7-迁移比较器,java-8,migration,java-7,comparator,Java 8,Migration,Java 7,Comparator,我很难理解如何在Java7中“迁移”一个简单的比较器 我在Java8中使用的实际版本如下: private static final Comparator<Entry> ENTRY_COMPARATOR = Comparator.comparing(new Function<Entry, EntryType>() { @Override public EntryType apply(Entry t) { return t.type;
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());
如何将相同的比较器迁移到Java7?我在谷歌上搜索解决方案,但我能想到的唯一一件事是实现我自己的类作为比较器接口实现
但如果我沿着这条路走下去,我怎么能在同一个“比较”方法中同时应用“比较”、“然后比较”和“反向”呢
提前感谢您可以用一个
比较方法编写逻辑:
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;
}
请注意,通过交换比较的条目
实例的顺序,可以实现中的相反顺序。即使您的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();
}
您可以用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();
private static final Comparator ENTRY\u Comparator=new Comparator(){
@凌驾
公共整数比较(左项,右项){
返回left.type.compareTo(right.type);
}
}
.然后比较long(新的tolong函数(){
@凌驾
公共长应用程序长(条目){
返回条目.value;
}
})
.reversed();
上面的代码是用-source 1.7
编译的,我会用guava
,它有ComparisonChain
,我想它可以帮你解决这个问题顺便说一句,你没有分享你的java 7代码版本,这就产生了您提到的错误。在返回结果之前,只需在结果前面加一个´-´即可反转结果。@Flown这可能不起作用。允许使用比较方法返回任何整数值。但是Integer.MIN_值的反作用是它本身,所以在这种情况下,这并不能达到反转比较意义的效果。@StuartMarks啊,你完全正确。也许应该应用Math::signum
来避免这种错误并否定结果。(我假设正确的-1,0,1值)。
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();