繁体   English   中英

Java Streams以Min / Max过滤嵌套集合

[英]Java Streams Filtering Nested Collections by Min/Max

我有一个Map<Integer, List<MyDayObject>> ,它代表一年中所有日期。
现在我只需要分析每周产生最高价值的日子。 我已经能够使用forEach获得嵌套流式处理,但我似乎无法正确地将其流式传输并最终collectList中。

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().entrySet() .max()但是无法.entrySet()工作。
通过嵌套List max过滤Map的最佳方法是什么?

您似乎需要将原始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

PS我刚刚复制了你的代码,找到了给定列表的最大元素,而没有尝试改进它,这可能是可能的。 我专注于获得所需的输出。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM