Java 8-Lambda表达式将List <String>转换为List <DTO>

时间:2019-11-13 05:57:05

标签: java lambda java-8 functional-programming java-stream

我有一个像这样的清单。想要执行一些过滤并将List的{​​{1}}转换为String的{​​{1}}:

List

在这里您可以看到,我现在有了一个列表S,我想将该列表S转换为UserDTO列表,其中我有一个方法DTO,并希望将S到用户名的字符串设置为ls。

任何人都知道如何使用现有的lambda表达式或新表达式来执行此操作。

3 个答案:

答案 0 :(得分:4)

通过使用另一个map操作,例如:

List<UserDTO> users  = Arrays.asList(te).parallelStream()
        .map(x -> x.replace(ISConstants.domainName, ""))
        .filter(x -> (!x.contains("_"))? ArrayUtils.contains(con, x.toLowerCase()): ArrayUtils.contains(con, x.split("_")[0].toLowerCase()))
        .filter(x -> !x.equalsIgnoreCase("b"))
        .map(s -> new UserDTO(s)) // or 'UserDTO::new' by using a constructor with 'name' being set
        .collect(Collectors.toList());

(基于Holger's comment),并通过使用正则表达式(例如:

)进一步改进它
List<UserDTO> users = Arrays.asList(te).parallelStream()
        .map(x -> x.replace(ISConstants.domainName, ""))
        .filter(x -> !x.equalsIgnoreCase("b")) // filter in using simpler condition first
        .filter(x -> ArrayUtils.contains(con, x.replaceFirst("_.*", "").toLowerCase())) // simplified using regex
        .map(s -> new UserDTO(s)) // or 'UserDTO::new' by using a constructor with 'name' being set
        .collect(Collectors.toList());

答案 1 :(得分:3)

假设DTO有一个构造函数,它需要一个String,则可以对其进行映射:

List<DTO> S  = Arrays.asList(te).parallelStream()
            .map(x -> x.replace(ISConstants.domainName, ""))
            .filter(x -> (!x.contains("_"))? ArrayUtils.contains(con, x.toLowerCase()): ArrayUtils.contains(con, x.split("_")[0].toLowerCase()))
            .filter(x -> !x.equalsIgnoreCase("b"))
            .map(x -> new DTO(x))
            .collect(Collectors.toList());

或更容易使用方法参考:

List<DTO> S  = Arrays.asList(te).parallelStream()
            .map(x -> x.replace(ISConstants.domainName, ""))
            .filter(x -> (!x.contains("_"))? ArrayUtils.contains(con, x.toLowerCase()): ArrayUtils.contains(con, x.split("_")[0].toLowerCase()))
            .filter(x -> !x.equalsIgnoreCase("b"))
            .map(DTO::new)
            .collect(Collectors.toList());

答案 2 :(得分:1)

如其他答案所示,您可以使用接收String并将其用户名设置为DTO的构造函数。

或者,如果您不能添加此类构造函数,则可以执行以下操作:

List<UserDTO> result = Arrays.asList(te).stream()
        .map(x -> x.replace(ISConstants.domainName, ""))
        .filter(x -> !x.contains("_") ? 
                     ArrayUtils.contains(con, x.toLowerCase()) : 
                     ArrayUtils.contains(con, x.split("_")[0].toLowerCase()))
        .filter(x -> !x.equalsIgnoreCase("b"))
        .map(x -> {
                     UserDTO u = new UserDTO();
                     u.setUserName(x);
                     return u;
         })
        .collect(Collectors.toList());

在这里,我使用Stream.map将字符串转换为UserDTO,并将该字符串设置为用户名。