我有一个像这样的清单。想要执行一些过滤并将List
的{{1}}转换为String
的{{1}}:
List
在这里您可以看到,我现在有了一个列表S,我想将该列表S转换为UserDTO列表,其中我有一个方法DTO
,并希望将S到用户名的字符串设置为ls。
任何人都知道如何使用现有的lambda表达式或新表达式来执行此操作。
答案 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
,并将该字符串设置为用户名。