【问题标题】:filter list using Java 8 lambda or stream api使用 Java 8 lambda 或流 api 过滤列表
【发布时间】:2018-06-22 18:24:35
【问题描述】:

我的班级结构 -

class A {
    List<B> bList;
}

class B {
   List<C> cList;
}

现在我有一个 A 类列表,我想根据 c.size() > 0 的条件对其进行过滤。我可以使用 2 for loop one for list A 和 other for list B 过滤它,但我想知道我可以使用没有 for 循环的 java 流 api 过滤 A 的列表。

我当前的代码(更新的代码)-

List<A> result = = new ArrayList<>();
for (A a : aList) {
   List<B> tempBList = = new ArrayList<>();
   for (B b : a.getBList) {
       if (b.getCList.size() > 0) {
          tempBList.add(b);
       }
   }

   if (tempBList.size() > 0) {
       a.setBList(tempBList);
       result.add(a);
   }
}

【问题讨论】:

  • 您可能忘记在您的示例中的 result.add(a); 之后放置 break; 语句
  • @lino 没有什么可以打破的。他需要收集与给定谓词匹配的所有A 实例。不要像这样添加虚假的 cmets。
  • @RavindraRanwala 目前他为每个匹配条件b.c.size() &gt; 0b 添加了一个a 实例。对我来说这看起来像是一个错字
  • @Lino 不,这不是错字,这是他需要的。他使用公共字段而不是 getter。
  • @RavindraRanwala 我认为我们彼此相邻。 a.bList。 OP 遍历该列表。然后检查项目b 是否有一个大于0 的列表b.c。如果是,则将a 添加到结果中。当前代码为每个b 执行此操作。这意味着结果列表中可能有多个相同的 a 实例

标签: java lambda java-8 java-stream


【解决方案1】:

是的,您可以:

List<A> result =
    listOfA.stream()
           .filter(a -> a.b.stream().anyMatch(b -> b.c.size() > 0))
           .collect(Collectors.toList());

这是假设您希望将每个通过该过滤器的A 实例添加到输出List 一次。

【讨论】:

    【解决方案2】:

    试试这个。 items 是您要过滤的列表。

        List<A> result = new ArrayList<>();
    
        result = items.stream().filter(a -> a.b.stream().filter(b -> b.c.size() > 0).count() > 0).collect(Collectors.toList());
    

    【讨论】:

    • 使用count() 的有趣想法。但请记住,filter(..).count(..) &gt; 0 将通过整个As 流。使用anyMatch() 将产生相同的结果,但一旦找到ACs 就会立即停止,这会提高效率。
    猜你喜欢
    • 2015-07-12
    • 2018-06-07
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2019-01-26
    • 2017-06-21
    • 2021-11-06
    相关资源
    最近更新 更多