Java 8 Java8到Java7-迁移比较器

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;

我很难理解如何在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());
如何将相同的比较器迁移到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();