[英]Java Streams Filtering Nested Collections by Min/Max
我有一個Map<Integer, List<MyDayObject>>
,它代表一年中所有日期。
現在我只需要分析每周產生最高價值的日子。 我已經能夠使用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()
的.entrySet()
.max()
但是無法.entrySet()
工作。
通過嵌套List
max
過濾Map
的最佳方法是什么?
您似乎需要將原始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
PS我剛剛復制了你的代碼,找到了給定列表的最大元素,而沒有嘗試改進它,這可能是可能的。 我專注於獲得所需的輸出。
正如holi-java所評論的,可以簡化比較元素的lambda表達式:
List<MyDayObject> allHighest =
weeks.values()
.stream()
.map(list -> list.stream().max(Comparator.comparing(MyDayObject::value)).get())
.collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.