例如:我有一个带有电子邮件的用户对象列表。我想收集具有不同电子邮件的用户列表(因为使用同一电子邮件的两个用户可能是同一个人,所以我不在乎这些差异)。换句话说,对于每个不同的键(电子邮件),我想获取通过该键找到的第一个值(用户),而忽略其余的值。
这是我想出的代码:
public List<User> getUsersToInvite(List<User> users) {
return users
.stream()
// group users by their e-mail
// the resulting map structure: email -> [user]
.collect(Collectors.groupingBy(User::getEmail, LinkedHashMap::new, Collectors.toList()))
// browse each map entry
.entrySet()
.stream()
// get the first user object for each entry
.map(entry -> entry.getValue().get(0))
// collect such first entries into a list
.collect(Collectors.toList());
}
还有一些更优雅的方法吗?
您可以使用Collectors.toMap(keyMapper, valueMapper, mergeFunction)
,将电子邮件用作键,将用户用作值,并通过始终返回第一个值来忽略键冲突。从中Map
,您可以通过调用来吸引用户values()
。
public List<User> getUsersToInvite(List<User> users) {
return new ArrayList<>(users.stream()
.collect(Collectors.toMap(User::getEmail,
Function.identity(),
(u1, u2) -> u1))
.values());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句