这里是 Java 8。我有 2 个 POJO:
public class User {
private String id;
private String moniker;
// ... lots of other fields
// Getters & setters down here
}
public class UserDetail {
private String userId;
private String moniker;
// ... lots of other fields
// Getters & setters down here
}
我得到了 List<User>
和一个 Set<UserDetail>
。如果有UserDetails
在那个集合中,谁的userId
字段匹配 User#id
中的任何一个用户列表中的值,我需要更新相应的 User#moniker
与 UserDetail
中的同名字段设置。
我已经能够用“旧”方式(Java 8 之前的 Stream/Collection API)来做到这一点,如下所示:
final List<User> users = userService.fetchSomehow();
final Set<UserDetail> userDetails = userDetailService.fetchSomehow();
for (UserDetail userDetail : userDetails) {
for (User user : users) {
if (userDetail.getUserId().equals(user.getId())) {
user.setMoniker(userDetail.getMoniker());
}
}
}
我如何使用 Java 8 API 来做到这一点?也就是说,我如何循环遍历两个集合,并且对于具有匹配 ID 的任何元素,使用 moniker
值来自UserDetails
更新moniker
Users
中的值?
最佳答案
如果将userDetails
放入 map 中,性能会更好
Map<String, String> userDetailsMap = userDetails.stream()
.collect(Collectors.toMap(UserDetail::getUserId, UserDetail::getMoniker));
users.stream().filter(u -> userDetailsMap.containsKey(u.getId())).forEach(u -> {
u.setMoniker(userDetailsMap.get(u.getId()));
});
关于java - 使用 Java 8 Streams 从不同类型的另一个集合更新集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042616/