Java 8 Stream调用comparingLong后reversed泛型推断报错原因求解
注:我已完全了解相关SO问题下提供的所有答案
我有一组记录需要结合另一个对象的上下文进行匹配、排序。
计算排序分值的操作开销很高,因此直接让这些类实现Comparable接口会导致运行速度过慢。
因此我写出了如下核心代码(已做大幅精简):
input .stream() // 执行计算并将结果缓存到Pair中 .map(record -> Pair.of(record, record.doCalculation(context))) .filter(record -> record.getRight() > 0) // 按计算得到的分值排序 .sorted(Comparator.comparingLong(Pair::getRight)) // 后续处理 .forEachOrdered(record -> log.info("Record: {} --> {}", record.getRight(), record.getLeft()) );
这段代码通过.sorted(Comparator.comparingLong(Pair::getRight))实现了分值升序排序。
我现在需要实现分值降序(即反转顺序)排序。
我最初以为直接链式调用reversed即可,写法如下:
.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
我猜测问题和Stream与泛型的协同工作机制有关,但暂未搞懂报错的根本原因,想请教我哪里写错了?
注:我目前临时使用了如下不优雅的规避方案:
.sorted(Comparator.comparingLong(p -> p.getRight()*-1L))
更新:参考Gaël J的建议已解决问题,解决方案如下:
.sorted((Comparator.comparingLong(Pair<MyThing, Long>::getRight)).reversed())
内容的提问来源于stack exchange,提问作者Niels Basjes
相关产品推荐
相关产品推荐

