Java 流 - 根据条件获取最多两个对象

丹尼尔·R。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章