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



