Java-按属性组合和最近日期筛选对象列表
我有一个包含属性名称、公司和日期的对象列表。我想筛选该列表,根据日期获取最新的姓名+公司组合。示例数据:Java-按属性组合和最近日期筛选对象列表,java,list,filter,compare,java-stream,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/20
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构造的对象,不是持久化实体,否则我会这样做:。但我想完成同样的事情
是否可以使用筛选器执行此操作,或者我唯一的选择是长路径?您希望使用收集器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());
函数keyGen=o->o.getName()+o.getCompany();
比较器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());
我建议您放弃流的想法,寻找更好的数据库检索方法。这些是java构造的对象,而不是实体,否则我会这样做。