Dru*_*les 16 java java-8 java-stream
给定一个具有属性的项目列表,我试图让最后一个项目显示所述属性的最大值.
例如,对于以下对象列表:
t i
A: 3
D: 7 *
F: 4
C: 5
X: 7 *
M: 6
Run Code Online (Sandbox Code Playgroud)
我可以得到最高的东西之一i:
Thing t = items.stream()
.max(Comparator.comparingLong(Thing::getI))
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
但是,这会得到我Thing t = D.是否有一种干净而优雅的方式来获取最后一项,即X在这种情况下?
一种可能的解决方案是使用该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);
Run Code Online (Sandbox Code Playgroud)
在valueFunction现在需要将近一倍,而调用.
其他明显的迂回解决方案是:
从比较器中删除equals选项(如果比较的数字相等则不返回0,返回-1)(即编写不包含equals选项的比较器):
Thing t = items.stream()
.max((a, b) -> a.getI() > b.getI() ? 1 : -1)
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
从概念上讲,您似乎可能正在寻找诸如thenComparing使用index列表中元素的 之类的东西:
Thing t = items.stream()
.max(Comparator.comparingLong(Thing::getI).thenComparing(items::indexOf))
.orElse(null);
Run Code Online (Sandbox Code Playgroud)