Java 8 Stream API过滤

时间:2015-03-12 04:04:53

标签: java algorithm functional-programming java-8

我有一组对象,具有以下类型:

{
    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是否易于使用?感谢。

1 个答案:

答案 0 :(得分:2)

您希望分组一个条件(action_target)与组合并到最大 { {1}}值:

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))); ,但当然,您可以在其上调用values()来获取一系列项目。

使用Map<String,Item>美化,代码如下:

static import

您处理幂等Map<String,Item> map=items.stream().collect(groupingBy(item->item.action_target, collectingAndThen(maxBy(comparing(item->item.action_time)), Optional::get))); 和后续"add"操作的其他请求可以简化为“删除最后操作为"delete"的项目”,这可以通过执行来实现在使用可变地图收集后:

"delete"