我有一个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
的最佳方法是什么?
答案 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());