Java 流相对较新,我遇到了一个我找不到解决方案的问题。
我有 10 个对象的列表并过滤它们以返回 4 个对象。
List<MyObject> objects.stream()
.filter(x -> x.getFlag == 1)
.filter(x -> x.amount != null)
.collect(Collectors.toList());
这将返回 4 个对象:
OBJECT 1: {stageNumber = 2, stageToCalc = 1}
OBJECT 2: {stageNumber = 5, stageToCalc = 1}
OBJECT 3: {stageNumber = 9, stageToCalc = 7}
OBJECT 4: {stageNumber = 10, stageToCalc = 7}
所以基本上我想做的是采取具有相同stageToCalc值的阶段并找到最大stageNumber。
EG:对象 3 和对象 4 具有相同的 stageToCalc = 7,根据阶段编号的最大值应返回对象 4:{stageNumber = 10, stageToCalc = 7},这是较高的值。
但是,当我需要获得 2 个(或更多,因为它可能是动态的)时,我的问题就出现了。在这种情况下 :
它应该返回对象 2和对象 4。
我试过使用:
objects.stream()
.collect(groupingBy(Function.identity(), TreeMap::new, toList())
.lastEntry()
.getValue()
.forEach(System.out::println)
这只会产生一个classCastException
,如果我使用.max()
它就不会编译。我可以通过一些 for 循环等以昂贵的方式轻松完成此任务。
但是我想知道是否有办法只使用 1 个流迭代。
希望我对这个问题很清楚。还是新的和学习的。
谢谢。
您可以使用Collectors.groupingBy()
with 下游Collectors.maxBy()
来获取适当的对象(WithCollectors.collectAndThen()
将它们从Optional
返回的值中拉出maxBy()
):
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class Demo {
private record MyObject(int stageNumber, int stageToCalc) {}
public static void main(String[] args) {
List<MyObject> objects = List.of(new MyObject(2, 1), new MyObject(5, 1), new MyObject(9, 7), new MyObject(10, 7));;
List<MyObject> maximums =
new ArrayList<>(objects.stream()
.collect(Collectors.groupingBy(MyObject::stageToCalc,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(MyObject::stageNumber)),
Optional::orElseThrow)))
.values());
System.out.println(maximums);
}
}
将打印出来
[MyObject[stageNumber=5, stageToCalc=1], MyObject[stageNumber=10, stageToCalc=7]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句