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