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

时间:2017-04-18 11:16:45

标签: java lambda java-8 java-stream

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

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的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

您似乎需要将原始地图的每个值映射到相应的最大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

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

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

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