java - 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())
解决方案
推荐阅读
- android - 使用 MSAL 进行应用注册时始终收到 AUTHORIZATION_NEEDED
- javascript - 如何以编程方式触发“查看问题(Alt + F8)”命令?
- jenkins - 使用 BitBucket Server 未发生拉取请求装饰警告
- rust - Rust 在更新时应用 upsert
- javascript - Project Euler Problem 3 的正确想法是什么?
- mysql - MySQL - INNER JOIN 与 SELECT 未给出预期结果
- postman - 邮递员 - 无法验证第一个证书 - 截图
- postgresql - Postgres 请求日期太长
- eclipse - “运行|调试”选项显示在 Eclipse 中使用 TestNG 和 Selenium 的每个测试上方
- python - 没有用户手册的 USB 设备。是否有执行“usb 命令扫描”的方法?