2017-05-30 103 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答案性能差異的一些具體證據。

相關問題