如何使用lambda表达式创建多个List?

时间:2015-12-25 19:11:12

标签: filter lambda java-8 java-stream predicate

我有一位年龄属性的用户。 在我的方法中,我有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?

2 个答案:

答案 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
});