【问题标题】:How can I create multiple List with lambda expression?如何使用 lambda 表达式创建多个列表?
【发布时间】:2015-12-25 19:11:11
【问题描述】:

我有一个具有年龄属性的用户。 在我的方法中,我有 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 lambda java-8 java-stream predicate


    【解决方案1】:

    你可以使用Collectors.partitioningBy(Predicate&lt;? super T&gt; predicate)

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

    partition.get(true) 将为您提供年龄 partition.get(false) 将为您提供年龄 >= 6 的用户列表。

    【讨论】:

    • 对不起,如果我的例子不清楚。我在代码块中有评论说它对另一个列表(如 gt6andlt30User)有更多条件。我们如何解决这个问题
    • @gianglaodai partitioningBy 仅适用于通过单个谓词将 List 分成两个分区。您可以使用Collectors.groupingBy 将列表分成年龄完全相同的用户组(即您将获得Map&lt;Integer,List&lt;User&gt;&gt;,但这可能不是您想要的。
    • 所以除了我的问题。如果我想在每个 if 块中添加元素到 List 之外,还有其他方法吗?
    • @gianglaodai 你能说得更具体点吗?那可能是什么?
    • 简单如下:if (user.getAge()&lt;6){print('Hello baby'+user.getName())} if(user.getAge()&gt;6{print('Hello boy'+user.getName())}
    【解决方案2】:

    我找到了一种使用 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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      相关资源
      最近更新 更多