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
值?
答案 0 :(得分:1)
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()));
});
答案 1 :(得分:0)
因为您的userId依赖于moniker参数。因此,我已经实现了同时使用流和高级for循环。你可以看一眼。您的问题也很棘手,很有趣。
一种方法
users.stream().forEach(System.out::println);
userdetails.stream().forEach(userdetail->{
for(User user : users) {
if(user.getId().equals(userdetail.getUserId())){
user.setMoniker(userdetail.getMoniker());
}
}
});
System.out.println("********************");
users.stream().forEach(System.out::println);
方法二
public static List<User> users = getUserList();
public static void main(String[] args) {
Set<UserDetail> userdetails = getUserDetails();
users.stream().forEach(System.out::println);
//Note: CompareUpdateList is name of my Class
userdetails.stream().forEach(CompareUpdateList::updateUser);
System.out.println("********************");
users.stream().forEach(System.out::println);
}
public static void updateUser(UserDetail userdetail) {
for(User user : users) {
if(user.getId().equals(userdetail.getUserId())){
user.setMoniker(userdetail.getMoniker());
}
}
}
第三种方法
public static List<User> users = getUserList();
public static void main(String[] args) {
Set<UserDetail> userdetails = getUserDetails();
users.stream().forEach(System.out::println);
//Note: CompareUpdateList is name of my Class
userdetails.stream().forEach(CompareUpdateList::updateUser);
System.out.println("********************");
users.stream().forEach(System.out::println);
}
public static void updateUser(UserDetail userdetail) {
users.stream().forEach(user->{
if(user.getId().equals(userdetail.getUserId())){
user.setMoniker(userdetail.getMoniker());
}
});
}