java - 使用 Java 8 Streams 从不同类型的另一个集合更新集合

标签 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 中的值?

最佳答案

如果将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/

相关文章:

java - 为什么 AbstractCollection 不实现 iterator()?

java - 如果集合中的元素类型是接口(interface)类型,那么如何填充集合? ( java )

java - 哪个更快? List.contains() 或 Map.containsKey()

java - 按两个字段分组,然后对 BigDecimal 求和

java - 从 Object[] 映射到自定义对象。使用 findBy SQL 查询

Java:如何知道 TIFF 图像是否为 Group4?

java - 如何在输出后将用户输入保持在同一行?

java - 使用 Maven 将 Grails 应用程序打包到 war

java - 如何在 JFreeChart 中自定义 CategoryPlot 项目的工具提示?

java - 如何在 MacOS 上安装特定的 JDK(jdk1.8.0_152.jdk)?