2017-05-30 65 views
4

我有一个对象列表。这些对象有一个字符串变量。我也有一个字符串列表。根据其他列表流和筛选一个列表

所以像这样的东西。

List<A> listA; 

class A { 

String x; 

} 
List<String> listB; 

我希望能够做的就是流和过滤listA的,基于x是否包含在列表B中的字符串对象的

这是可行的?

+1

包含还是等于? – shmosel

+2

您应该向我们展示如何使用常规循环来做到这一点,以便我们更清楚地了解您想要做什么。 – Radiodef

回答

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

我不得不用allMatch替换anyMatch,它工作。 – Shan

1

当然 - 只需拨打containsfilter子句中:

List<A> filtered = 
    listA.stream().filter(a -> listB.contains(a.x)).collect(Collectors.toList()); 
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答案性能差异的一些具体证据。