这里是Java 8。我有两个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值相匹配,则需要用UserDetail集中同名的字段更新相应的User#moniker。
我能够用“旧”方式(前Java 8流/集合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来做到这一点呢?也就是说,如何循环两个集合,对于任何具有匹配in的元素,都可以使用来自UserDetails的UserDetails值来更新Users中的moniker值。
发布于 2019-05-08 14:12:06
如果将userDetails放在映射中,性能明智会更好。
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()));
});发布于 2019-05-08 17:10:44
因为您的userId依赖于moniker参数。因此,我已经实现了同时使用流和高级for循环。你可以看一眼。你的问题既棘手又有趣。
https://stackoverflow.com/questions/56042616
复制相似问题