簡體   English   中英

Java Streams以Min / Max過濾嵌套集合

[英]Java Streams Filtering Nested Collections by Min/Max

我有一個Map<Integer, List<MyDayObject>> ,它代表一年中所有日期。
現在我只需要分析每周產生最高價值的日子。 我已經能夠使用forEach獲得嵌套流式處理,但我似乎無法正確地將其流式傳輸並最終collectList中。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM