Java-按属性组合和最新日期过滤对象列表

时间:2018-10-18 13:37:07

标签: java list filter compare java-stream

我有一个带有属性名称,公司和日期的对象列表。我想过滤该列表以获取基于日期的最新名称+公司组合。示例数据:

id | name | company | date
----------------------
 1 | bob  |    A    | 01/2017
 2 | bob  |    A    | 01/2016
 3 | bob  |    A    | 01/2015
 4 | bob  |    B    | 03/2017
 5 | sal  |    B    | 04/2018
 6 | sue  |    A    | 01/2016
 7 | sue  |    A    | 01/2017
 8 | sue  |    A    | 01/2015

所需结果应为包含ID:1、4、5和7的列表。

如果名称+公司组合不存在,我可以遍历列表中的每个项目并将其添加到新列表中,如果存在,请检查日期以查看是否应替换现有项目。但是我觉得应该有一种更简单的方法可以通过流和过滤器来做到这一点。我只是想不到如何。搜索提供了Collections.max之类的方法,但是我想要一个基于组合的max列表。

这些是Java构造的对象,而不是持久的实体,否则我将执行以下操作:GROUP BY with MAX(DATE)。但我想完成同样的事情。

是否可以使用过滤器执行此操作,还是我的唯一选择是长途旅行?

1 个答案:

答案 0 :(得分:1)

您要使用Collectors API中的groupingBy方法。它允许您提供功能,该功能基于流中的对象创建密钥,然后为您提供Map>。您将获得如下代码:

Function<YourObject, String> keyGen = o -> o.getName() + o.getCompany();
Comparator<YourObject> comp = (f1, f2) -> f1.date().compareTo(f2.getDate()
yourObjects.stream().collect(Collectors.groupingBy(keyGen)).values().stream().map(list -> Collections.max(list, comp)).map(MyObject::getId).collect(Collectors.toList());