簡體   English   中英

Java 8流API過濾

[英]Java 8 Stream API Filtering

我有以下類型的對象的集合:

{
    String action_name; //add or delete
    long action_time;
    String action_target;
}

需要獲取每個action_target上的最新合並操作

樣本輸入數據:

[add|1001|item1, add|1002|item2, delete|1003|item1, add|1004|item1]

預期結果:

[add|1002|item2, add|1004|item1]

樣本輸入數據:

[add|1001|item1, add|1002|item2, delete|1003|item1]

預期結果:

[add|1002|item2]

樣本輸入數據:

[delete|1001|item1, add|1002|item2, add|1003|item1]

預期結果:

[add|1002|item2, add|1003|item1]

使用Java8流API可以做到這一點嗎? 謝謝。

您想一個條件( action_target )分組,同時將組減少最大 action_time值:

Map<String,Item> map=items.stream().collect(
    Collectors.groupingBy(item->item.action_target,
        Collectors.collectingAndThen(
            Collectors.maxBy(Comparator.comparing(item->item.action_time)),
            Optional::get)));

這將返回Map<String,Item>但是,當然,您可以在其上調用values()以獲取項目集合。

static import s進行美化,代碼如下所示:

Map<String,Item> map=items.stream().collect(groupingBy(item->item.action_target,
    collectingAndThen(maxBy(comparing(item->item.action_time)), Optional::get)));

您對處理冪等"add"和后續"delete"操作的附加請求可以簡化為“刪除最后一個操作為"delete" ”,只需在使用可變映射進行收集之后執行此操作即可實現:

HashMap<String,Item> map=items.stream().collect(groupingBy(
    item->item.action_target, HashMap::new,
    collectingAndThen(maxBy(comparing(item->item.action_time)), Optional::get)));
map.values().removeIf(item->item.action_name.equals("delete"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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