使用 Java 8 Stream API 根据 ID 和日期过滤对象

2022-01-22 00:00:00 java-8 java java-stream

我有一个 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)));

相关文章