我有一个 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/