首页 > 解决方案 > Java 8+ 流、泛型和 lambda 表达式

问题描述

[注意:我完全了解此 SO 问题中提供的答案]

我有一组需要在其他对象的上下文中匹配/排名的记录。

确定排名分数所需的比较是“昂贵的”,因此简单地使这些类实现Comparable(如另一个 SO 问题中所示)会使其太慢。

所以我想出了本质上(非常简化的代码!)这个:

input
    .stream()
    // Do the calculation and cache the result in a Pair
    .map(record -> Pair.of(record, record.doCalculation(context)))
    .filter(record -> record.getRight() > 0)
 
    // Sort by the calculated value
    .sorted(Comparator.comparingLong(Pair::getRight))

    // and do something with it.
    .forEachOrdered(record -> 
        log.info("Record: {} --> {}", record.getRight(), record.getLeft())
    );

这会将记录排序为分数递增的顺序:

.sorted(Comparator.comparingLong(Pair::getRight))

我需要解决的问题是我需要一个递减的分数排序(即反转)。

最初预计这会起作用

.sorted(Comparator.comparingLong(Pair::getRight).reversed())

我检查了该.reversed()方法,它似乎返回了一个比较器(类 Collections.ReverseComparator2),它只是在将两个提供的值输入原始比较器之前交换它。

然而,这失败了(命令行)

 incompatible types: cannot infer type-variable(s) T
    (argument mismatch; invalid method reference
      method getRight in class org.apache.commons.lang3.tuple.Pair<L,R> cannot be applied to given types
        required: no arguments
        found: java.lang.Object
        reason: actual and formal argument lists differ in length)

在 IntelliJ 中,它给出了一个不同的错误:Non-static method cannot be referenced from a static context

我怀疑它与流和泛型如何协同工作有关。

我的问题是我还不明白为什么这会失败。

我在这里做错了什么?


注意:现在我正在使用这个丑陋的解决方法:

.sorted(Comparator.comparingLong(p -> p.getRight()*-1L))

更新:解决了Gaël J的建议

.sorted((Comparator.comparingLong(Pair<MyThing, Long>::getRight)).reversed())

标签: javagenericsjava-8java-stream

解决方案


推荐阅读