代码之家  ›  专栏  ›  技术社区  ›  Renaud is Not Bill Gates

使用流从两个数组创建数组

  •  2
  • Renaud is Not Bill Gates  · 技术社区  · 6 年前

    我有如下代码:

    List<UserDTO> result = new ArrayList<>();
    UserDTO userDTO;
    for (User user : users) {
        for (Individual individual : individuals) {
            if (individual.getKey().equals(user.getIndividualId())) {
                userDTO = new UserDTO();
                userDTO.setUserId(user.getUserId());
                userDTO.setFirstName(individual.getFirstName());
                userDTO.setLastName(individual.getLastName());
                result.add(utilisateurDTO);
                break;
            }
        }
    }
    

    如何使用Java 8流编写此文件?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Ousmane D.    6 年前

    将键和值存储到地图中:

    Map<T, Individual> individualsMap =
                    individuals.stream()
                            .collect(Collectors.toMap(Individual::getKey,
                                    Function.identity(),
                                    (l, r) -> l));
    

    哪里 T 是什么类型的 Individual::getKey 是。

    Java-8解决方案:

    List<UserDTO> resultSet = 
           users.stream()
                .map(user -> Optional.ofNullable(individualsMap.get(user.getIndividualId()))
                        .map(i -> new AbstractMap.SimpleEntry<>(i, user.getUserId())).orElse(null))
                .filter(Objects::nonNull)
                .map(e -> new UserDTO(e.getValue(), e.getKey().getFirstName(), e.getKey().getLastName()))
                .collect(Collectors.toList());
    

    Java-9解决方案:

    List<UserDTO> resultSet = 
            users.stream()
                 .flatMap(user -> Optional.ofNullable(individualsMap.get(user.getIndividualId()))
                            .map(i -> Map.entry(i, user.getUserId())).stream())
                 .map(e -> new UserDTO(e.getValue(), e.getKey().getFirstName(), e.getKey().getLastName()))
                 .collect(Collectors.toList());
    

    这假设您有一个这样的构造函数:

    public UserDTO(T userId, String firstName, String lastName) { ... }
    

    哪里 T 应替换为任何类型 userId 是。

        2
  •  2
  •   Ousmane D.    6 年前

    未测试,但您可以尝试类似的操作:

    List<UserDTO> userDtos = 
                users.stream()
                     .map(u -> individuals.stream()
                                           .filter(indiv -> indiv.getKey()
                                                                 .equals(u.getIndividualId()))
                                           .findFirst()                                                        
                                           .map(indiv -> new UserDTO(u.getUserId(), indiv.getFirstName(), indiv.getLastName()))
                                           .orElse(null))
                     .filter(Objects::nonNull)                                                         
                     .collect(Collectors.toList());
    

    findFirst() 一旦检测到个人和用户之间的匹配,将允许内部迭代短路。
    我在 UserDTO() 以便于初始化。

        3
  •  1
  •   Youcef LAIDANI    6 年前

    正如评论中所建议的 @JB Nizet ,不配合 O(n^2) 我想通过以下两个步骤来解决问题:

    Map<Long, Individual> individualsMap =
            individual.stream()
                    .collect(Collectors.toMap(Individual::getKey, Function.identity()));
    
    List<UserDTO> result = users.stream()
            .filter(user -> individualsMap.containsKey(user.getKey()))
            .map(user -> {
                UserDTO userDTO = new UserDTO();
                Individual indivd = individualsMap.get(user.getKey());
                userDTO.setUserId(user.getUserId());
                userDTO.setFirstName(indivd.getFirstName());
                userDTO.setLastName(indivd.getLastName());
                return userDTO;
            }).collect(Collectors.toList());