2017-05-30 10 views
4

私はオブジェクトのリストを持っています。これらのオブジェクトには文字列変数があります。私も弦のリストを持っています。他のリストに基づいて1つのリストをストリームしてフィルタリングする

このようなものです。私が行うことができるようにしたいどのような

List<A> listA; 

class A { 

String x; 

} 
List<String> listB; 

は、xがリストB.

の文字列オブジェクトのいずれかが含まれているかどうかに基づいて、ストリームとLISTAをフィルタであり、このなんとかですか?

+1

含まれていますか? – shmosel

+2

通常のループを使ってどのようにこれを行うのかを私たちに見せてください。そうすれば、あなたは何をしたいのかがはっきり分かります。 – Radiodef

答えて

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

私はanyMatchをallMatchに置き換えなければならなかった。 – Shan

1

確かに - ちょうどfilter句でcontainsを呼び出す:

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

あなたは本当にString値を格納するためHashSetを使用する必要があります。理由は、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の答えを参照してください。