使用Java 8 Streams更新其他类型的另一个集合中的集合

时间:2019-05-08 14:01:51

标签: java collections java-8 java-stream

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#monikerUserDetail中的名称相同。

我已经能够采用“旧”方式(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值?

2 个答案:

答案 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循环。你可以看一眼。您的问题也很棘手,很有趣。

  1. 一种方法

    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);
    
  2. 方法二

    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());
           }
       }
    }
    
  3. 第三种方法

        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());
          }
       });
    }