使用 Java 8 流方法获取最后一个最大值

2022-09-03 14:01:43

给定具有属性的项列表,我正在尝试使最后一项以所述属性的最大值显示。

例如,对于以下对象列表:

t  i
A: 3
D: 7 *
F: 4
C: 5
X: 7 *
M: 6

我可以得到一个最高的东西:i

Thing t = items.stream()
        .max(Comparator.comparingLong(Thing::getI))
        .orElse(null);

但是,这将得到我.有没有一种干净而优雅的方式来获得最后一项,即 在这种情况下?Thing t = DX

一种可能的解决方案是使用该函数。但是,该属性是动态计算的,它看起来更像:reduce

Thing t = items.stream()
        .reduce((left, right) -> {
            long leftValue = valueFunction.apply(left);
            long rightValue = valueFunction.apply(right);
            return leftValue > rightValue ? left : right;
        })
        .orElse(null);

现在需要调用的频率几乎是其两倍。valueFunction

其他明显的环形交叉路口解决方案包括:

  1. 将对象及其索引存储在元组中
  2. 将对象存储在具有计算值的元组中
  3. 事先反转列表
  4. 不要使用流

答案 1

从比较器中删除 equals 选项(如果比较的数字相等,则不返回 0,而是返回 -1)(即编写自己的不包含 equals 选项的比较器):

Thing t = items.stream()
        .max((a, b) -> a.getI() > b.getI() ? 1 : -1)
        .orElse(null);

答案 2

从概念上讲,您似乎正在寻找类似于使用列表中的元素的东西:thenComparingindex

Thing t = items.stream()
        .max(Comparator.comparingLong(Thing::getI).thenComparing(items::indexOf))
        .orElse(null);

推荐