2015-12-25 34 views
3

我有一个具有年龄属性的用户。 而在我的方法中,我有List。我怎样才能把它拆分到多个表的其他用户,如:如何使用lambda表达式创建多个List?

List<User> lt6Users = new ArrayList<User>(); 
List<User> gt6Users = new ArrayList<User>(); 
for(User user:users){ 
    if(user.getAge()<6){ 
     lt6Users.add(user); 
    } 
    if(user.getAge()>6){ 
     gt6Users.add(user); 
    } 
    // more condition 
} 

我只知道用lambda表达式2路:

lt6Users = users.stream().filter(user->user.getAge()<6).collect(Collectors.toList()); 
gt6Users = users.stream().filter(user->user.getAge()>6).collect(Collectors.toList()); 

上面的代码是非常差的性能,因为它会遍历列表很多时间

users.stream().foreach(user->{ 
    if(user.getAge()<6){ 
    lt6Users.add(user); 
    } 
    if(user.getAge()>6{ 
    gt6Users.add(user); 
    } 
}); 

上面的代码看起来像从没有lambda表达式的开始代码的代码。是否有另一种使用lambda表达式特征(如filter和Predicate)编写代码的方法?

回答

5

您可以使用Collectors.partitioningBy(Predicate<? super T> predicate)

Map<Boolean, List<User>> partition = users.stream() 
              .collect(Collectors.partitioningBy(user->user.getAge()<6)); 

partition.get(true)会给你的用户随着年龄< 6名单,并partition.get(false)会给你的用户列表,年龄> = 6

+0

对不起,如果我的例子不清楚。我在代码块有评论说它有更多的条件,像gt6andlt30User的另一个列表。我们如何解决这个问题 – gianglaodai

+1

@gianglaodai'partitioningBy'只适合用一个谓词将List分解成两个分区。你可以使用'Collectors.groupingBy'来将List分成具有完全相同年龄的用户组(即你将得到一个'Map >',但也许这不是你想要的。 – Eran

+0

so in另外我的问题,如果我想在每个if区块中添加元素到列表中,那么有没有办法做到这一点? – gianglaodai

-1

我已经找到一种方法,使用lambda表达式这个问题: 写与谓语的方法:

​​

所以循环可以这样写:

users.foreach(user->{ 
    addUser(lt6Users,user,(User u)->u.getAge()<6); 
    addUser(gt6Users,user,(User u)->u.getAge()>6); 
    // more condition 
});