Java Streams 按最小值/最大值过滤嵌套集合

标签 java lambda java-8 java-stream

我有一个 Map<Integer, List<MyDayObject>>表示一年中的所有日子。
现在我只需要分析每周产生最高值(value)的日子。我已经能够让嵌套流与 forEach 一起工作但我似乎无法正确地传输它和collect进入List在最后。

weeks.forEach((k, v) -> { 
        MyDayObject highest = v.stream()
            .max((o1, o2) -> o1.value().compareTo(o2.value())).get();      
        System.out.println(highest);
    });

虽然我需要的不是打印它,而是得到一个 List<MyDayObject> allHighest在最后。

我试过了 .filter正在 .entrySet()通过 .max()但无法让它发挥作用。
过滤 Map 的最佳方法是什么?通过 max嵌套的 List

最佳答案

看来您需要将原始 Map 的每个值映射到相应的最大值 MyDayObject:

List<MyDayObject> allHighest = 
    weeks.values() // produces a Collection<List<MyDayObject>>
         .stream() // produces a Stream<List<MyDayObject>>
         .map(list -> list.stream() // transforms each List<MyDayObject> to a MyDayObject 
                                    // to obtain a Stream<MyDayObject>
                          .max((o1, o2) -> o1.value().compareTo(o2.value())).get())
         .collect(Collectors.toList()); // collects the elements to a List

附言我只是复制了您找到给定列表的最大元素的代码,而没有尝试对其进行改进,这可能是可能的。我专注于获得所需的输出。

正如holi-java评论的,比较元素的lambda表达式可以简化:

List<MyDayObject> allHighest = 
    weeks.values() 
         .stream() 
         .map(list -> list.stream().max(Comparator.comparing(MyDayObject::value)).get())
         .collect(Collectors.toList());

关于Java Streams 按最小值/最大值过滤嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43470648/

相关文章:

java - 一个小程序让Windows 7彻底死机

java - ADT 更新后出现 NoClassDefFound 错误

c# - 如何使用带有 C# lambda 表达式的另一个表列中的 orderby

lambda - 使用 Stream api 对多个变量进行减少和分配

Java 8 流 : Find first element after element

java - 我可以对注释本身使用 BeanValidation 吗?

Java SAX 解析器验证

返回索引 0 处的值的 Python 函数?

Java 8 可选 ifPresent() 与 != null

java - 使用 Java 8 Stream API 缩减 Map