You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:21:01