我有一個對象列表。這些對象有一個字符串變量。我也有一個字符串列表。根據其他列表流和篩選一個列表
所以像這樣的東西。
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