我有一位年龄属性的用户。 在我的方法中,我有List。如何将其拆分为多个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表达式的两种方式:
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?
答案 0 :(得分:5)
您可以使用Collectors.partitioningBy(Predicate<? super T> predicate)
:
Map<Boolean, List<User>> partition = users.stream()
.collect(Collectors.partitioningBy(user->user.getAge()<6));
partition.get(true)
会为您提供年龄<&lt;岁的用户列表6,partition.get(false)
将为您提供年龄> = 6的用户列表。
答案 1 :(得分:-1)
我找到了一种方法来使用lambda表达式来解决这个问题: 用Predicate写一个方法:
public void addUser(List<User> users,User user,Predicate<User> p){
if(p.test(user)){
users.add(user);
}
}
所以循环可以像这样写:
users.foreach(user->{
addUser(lt6Users,user,(User u)->u.getAge()<6);
addUser(gt6Users,user,(User u)->u.getAge()>6);
// more condition
});