[英]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.