2017-03-21 70 views
3

這是起源:如何寫一個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中做到這一點?

回答

5

您需要使用的flatMap代替map矯平由role.getManagedRole()返回到單個Stream<Role>所有List<Role>秒。

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

flatMap這個例子附加elementrs!而已 – Tiina

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);