如何编写lambda过滤和映射列表到列表

时间:2017-03-21 09:45:05

标签: java lambda

这是起源:

List<Role> managedRoles = new ArrayList<>();
for (Role role : roles) {
    if (role.getManagedRole() != null) { // a list of Role.
        managedRoles.addAll(role.getManagedRole());
    }
}

这就是我想要的:

managedRoles = roles.stream().filter(r -> r.getManagedRole() != null).map(role -> role.getManagedRole()).collect(); // how to addAll ?

但是role.getManagedRole() is a List<Role>,我认为需要像addAll这样的功能。那么如何在Lambda中制作呢?

2 个答案:

答案 0 :(得分:5)

您需要使用flatMap代替mapList<Role>返回的所有role.getManagedRole()展平为单个Stream<Role>

List<Role> managedRoles = 
    roles.stream()
         .filter(r -> r.getManagedRole() != null)
         .flatMap(role -> role.getManagedRole().stream())
         .collect(Collectors.toList());

答案 1 :(得分:0)

managedRoles = roles.stream()
      .filter(r -> r.getManagedRole() != null)
      .flatMap(role -> role.getManagedRole())
      .collect(Collectors.toList());

生成列表 或尝试此示例以将元素添加到现有列表

List<String> destList = Collections.synchronizedList(
                 new ArrayList<>(Arrays.asList("foo")));
List<String> newList = Arrays.asList("0", "1", "2", "3", "4", "5");
newList.stream()
       .collect(Collectors.toCollection(() -> destList));
System.out.println(destList);