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



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

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 之类的方法,但我想要一个基于组合的最大值列表。

这些是java构造的对象,而不是持久化的实体,否则我会做这样的事情:GROUP BY with MAX(DATE(。但我想完成同样的事情。

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

你想要使用收集器 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());

我在这里遇到了同样的问题。这是我与一位数据库专家朋友一起得到的解决方案:

SELECT 
b1.name,b1.date, b1.balance, b1.user_id
FROM table_name b1
INNER JOIN (SELECT b.name,max(b.date) as maxdate,b.user_id
FROM table_name b
GROUP BY b.user_id,b.name, CAST(b.date as date)) as b2 ON b2.user_id = b1.user_id AND b2.name = b1.name AND b2.maxdate = b1.date
where b1.user_id = '1'
and b1.date >= '2021-11-01 00:00:00'
AND b1.date <= '2021-11-30 23:59:59'
order by b1.name, b1."date" asc ;

相关内容

  • 没有找到相关文章

最新更新