【问题标题】:Stream and filter one list based on other list根据另一个列表流式传输和过滤一个列表
【发布时间】:2017-10-31 13:19:59
【问题描述】:

我有一个对象列表。这些对象有一个字符串变量。我还有一个字符串列表。

所以是这样的。

List<A> listA;

class A {

String x;

}
List<String> listB;

我想要做的是根据 x 是否包含列表 B 中的任何字符串对象,对列表 A 进行流式处理和过滤。

这可行吗?

【问题讨论】:

  • 包含或等于?
  • 您应该向我们展示如何使用常规循环执行此操作,以便我们更清楚地了解您想要做什么。

标签: java list java-8


【解决方案1】:

您确实应该使用HashSet 来存储String 值。原因是HashSet 保证O(1) 或恒定时间查找。对于列表,它是 O(n),这意味着查找 (.contains) 需要在最坏的情况下遍历其所有元素。

所以下面的方法会更有效率:

List<A> listA ...
Set<String> setB = new HashSet<>(); // populate setB
List<A> filteredA =
    listA.stream()
        .filter(a -> setB.contains(a.x)).collect(toList());

另请参阅this 答案,了解性能差异的一些具体证据。

【讨论】:

    【解决方案2】:
    List<A> filtered = 
        listA.stream()
             .filter(a -> listB.stream().anyMatch(b -> x.a.contains(b)))
             .collect(Collectors.toList());
    

    【讨论】:

    • 我不得不用 allMatch 替换 anyMatch 并且它起作用了。
    【解决方案3】:

    当然 - 只需在 filter 子句中调用 contains

    List<A> filtered = 
        listA.stream().filter(a -> listB.contains(a.x)).collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多