我有一个对象列表。这些对象有一个字符串变量。我也有一个字符串列表。根据其他列表流和筛选一个列表
所以像这样的东西。
List<A> listA;
class A {
String x;
}
List<String> listB;
我希望能够做的就是流和过滤listA的,基于x是否包含在列表B中的字符串对象的
这是可行的?
我有一个对象列表。这些对象有一个字符串变量。我也有一个字符串列表。根据其他列表流和筛选一个列表
所以像这样的东西。
List<A> listA;
class A {
String x;
}
List<String> listB;
我希望能够做的就是流和过滤listA的,基于x是否包含在列表B中的字符串对象的
这是可行的?
List<A> filtered =
listA.stream()
.filter(a -> listB.stream().anyMatch(b -> x.a.contains(b)))
.collect(Collectors.toList());
我不得不用allMatch替换anyMatch,它工作。 – Shan
当然 - 只需拨打contains
的filter
子句中:
List<A> filtered =
listA.stream().filter(a -> listB.contains(a.x)).collect(Collectors.toList());
你真的应该使用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答案性能差异的一些具体证据。
包含还是等于? – shmosel
您应该向我们展示如何使用常规循环来做到这一点,以便我们更清楚地了解您想要做什么。 – Radiodef