使用 Java 8 Stream API 根据 ID 和日期过滤对象
我有一个 Contact
类,每个实例都有一个唯一的 contactId
.
I have a Contact
class, for which each instance has a unique contactId
.
public class Contact {
private Long contactId;
... other variables, getters, setters, etc ...
}
还有一个 Log
类,详细说明 Contact
在某个 lastUpdated
日期执行的 action
.
And a Log
class that details an action
performed by a Contact
on a certain lastUpdated
date.
public class Log {
private Contact contact;
private Date lastUpdated;
private String action;
... other variables, getters, setters, etc ...
}
现在,在我的代码中,我有一个 List<Log>
,它可以包含单个 Contact
的多个 Log
实例.我想根据 Log代码>对象.结果列表应包含每个
Contact
的最新 Log
实例.
Now, in my code I have a List<Log>
that can contain multiple Log
instances for a single Contact
. I would like to filter the list to include only one Log
instance for each Contact
, based on the lastUpdated
variable in the Log
object. The resulting list should contain the newest Log
instance for each Contact
.
我可以通过创建一个 Map
,然后循环并获取具有最大 lastUpdated<的
Log
实例来做到这一点/code> 变量用于每个 Contact
,但这似乎可以使用 Java 8 Stream API 更简单地完成.
I could do this by creating a Map<Contact, List<Log>>
, then looping through and getting the Log
instance with max lastUpdated
variable for each Contact
, but this seems like it could be done much simpler with the Java 8 Stream API.
如何使用 Java 8 Stream API 实现这一点?
How would one accomplish this using the Java 8 Stream API?
推荐答案
你可以链接多个收集器来得到你想要的:
You can chain several collectors to get what you want:
import static java.util.stream.Collectors.*;
List<Log> list = ...
Map<Contact, Log> logs = list.stream()
.collect(groupingBy(Log::getContact,
collectingAndThen(maxBy(Comparator.comparing(Log::getLastUpdated)), Optional::get)));
相关文章