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
过滤映射的最佳方法是什么 似乎需要将原始映射的每个值映射到相应的maxMyDayObject
:
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))
。然后,您不必处理可选的。