Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-按属性组合和最近日期筛选对象列表_Java_List_Filter_Compare_Java Stream - Fatal编程技术网

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构造的对象,而不是实体,否则我会这样做。