Использование Java 8 Streams для обновления коллекций из другой коллекции другого типа - PullRequest
0 голосов
/ 08 мая 2019

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.

Мне удалось сделать это "старым" способом (API-интерфейсы потока / коллекции до Java 8), например, так:

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 8API-интерфейсы?То есть, как я мог бы пройти через обе коллекции и для любых элементов с совпадающими идентификаторами, использовать значение moniker из UserDetails, чтобы обновить значение moniker в Users?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

производительность будет лучше, если поместить 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()));
});
0 голосов
/ 08 мая 2019

Так как ваш userId зависит от параметра moniker.Итак, я реализовал, используя и поток, и продвижение для цикла.Вы можете иметь взгляд.Ваш вопрос также сложен и интересен.

  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());
          }
       });
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...