小编典典
您可以创建一个包含三个字段的键类,例如
@Data
class UserKey {
String firstName;
String lastName;
String type;
static UserKey from(User user) { /* TODO (trivial) */ }
}
分组
这些可以用来对您的用户进行分组
Map> grouped =
users.stream().collect(Collectors.groupingBy(UserKey::from));
这些列表中的每一个都可以通过合并
Optional summed = userList.stream()
.collect(Collectors.reducing((u1, u2) -> {
u1.setAccountBalance(u1.accountBalance() + u2.accountBalance());
});
也可以直接将其作为下游收集器提供给groupingBy:
Map> mergedMap =
users.stream().collect(Collectors.groupingBy(UserKey::from,
Collectors.reducing((u1, u2) -> {
u1.setAccountBalance(u1.accountBalance() + u2.accountBalance());
return u1;
}));
由于Optional可以确保已填充了这些,因此您可以调用get()它们;而且,您不再需要按键,因此
List result = mergedMap.values().stream()
.map(Optional::get)
.collect(toList());
地图
就像Naman在评论中建议的那样,您也可以通过快捷方式toMap。
Map mergedMap = users.stream()
.collect(toMap(UserKey::from, Function.identity(),
(u1, u2) -> {
u1.setAccountBalance(u1.accountBalance() + u2.accountBalance());
return u1;
}));
List result = new ArrayList<>(mergedMap.values());
请注意,reduce函数具有操作列表中原始用户对象之一的副作用,因此请确保不再需要它们。
2020-11-26