Java Streams按最小值/最大值筛选嵌套集合

Java Streams按最小值/最大值筛选嵌套集合,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有一个地图,表示一年中每周的所有天数。 现在我只需要分析每周产生最高值的天数。我已经能够使用forEach实现嵌套流式处理,但我似乎无法正确地将其流式处理,并在最后将收集到列表中 weeks.forEach((k, v) -> { MyDayObject highest = v.stream() .max((o1, o2) -> o1.value().compareTo(o2.value())).get(); S

我有一个
地图
,表示一年中每周的所有天数。
现在我只需要分析每周产生最高值的天数。我已经能够使用
forEach
实现嵌套流式处理,但我似乎无法正确地将其流式处理,并在最后将
收集到
列表中

weeks.forEach((k, v) -> { 
        MyDayObject highest = v.stream()
            .max((o1, o2) -> o1.value().compareTo(o2.value())).get();      
        System.out.println(highest);
    });
但我需要的不是打印它,而是在最后得到一个
列表

我尝试通过
.max()
.entrySet()
进行
.filter
过滤,但无法使其工作。

通过嵌套的
列表的
max
过滤
映射的最佳方法是什么

似乎需要将原始映射的每个值映射到相应的max
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
List allHighest=
weeks.values()//生成一个集合
.stream()//生成一个流
.map(list->list.stream()//将每个列表转换为MyDayObject
//获取流
.max((o1,o2)->o1.value().compareTo(o2.value()).get())
.collect(Collectors.toList());//将元素收集到列表中
另外,我刚刚复制了您的代码,该代码可以在给定列表中查找最大元素,但没有尝试对其进行改进,这是可能的。我专注于获得期望的输出

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

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

Ah,
map
it,而不是
filter
it!谢谢!是否还要详细说明如何改进它?@TommyF您可以使用
Comparator.comparating(MyDayObject::value)
。@TommyF您从holi javaOr获得答案,而不需要不必要的流操作:
Collections.max(list,Comparator.comparating(MyDayObject::value))
。然后,您不必处理
可选的