我有一个Contact类,每个实例都有一个唯一的contactId

public class Contact {
    private Long contactId;

    ... other variables, getters, setters, etc ...
}

还有一个Log类,它详细说明了由action在某个Contact日期执行的lastUpdated
public class Log {
    private Contact contact;
    private Date lastUpdated;
    private String action;

    ... other variables, getters, setters, etc ...
}

现在,在我的代码中,我有一个List<Log>,它可以为一个Log包含多个Contact实例。我想根据Log对象中的Contact变量,对列表进行筛选,以便每个lastUpdated仅包含一个Log实例。结果列表应包含每个Log的最新Contact实例。

我可以通过创建一个Map<Contact, List<Log>>,然后遍历并为每个Log获取具有最大lastUpdated变量的Contact实例来做到这一点,但这似乎可以使用Java 8 Stream API来完成。

使用Java 8 Stream API如何做到这一点?

最佳答案

您可以链接多个收集器以获得所需的内容:

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)));

09-05 08:54
查看更多