2016-05-31 6 views
2

私はマップを持っています。のは、各列車は、私はマップを反復処理し、少なくとも一つの青色の部分を持っているすべての列車を収集する別のリストJavaストリーム - リストの少なくとも1つの要素に別の要素が含まれていることを確認してください

List<Integer> blueParts; 

を持っているリスト

List<Integer> parts = train.getTrainParts() 

を持って

Map<Long, Train> 

を言ってみましょう。

これはStream秒の素朴な使い方です:

trainMap().values().stream().filter(part -> { 
    boolean found = false; 
    for (Long part : train.getTrainParts()) { 
     if (blueParts.conatins(part)) { 
       found = true; 
     } 
    } 
    return found; 
).collect(Collectors.toList()); 

より良いオプションは何ですか? ストリームまたはストリームしない?

tagDataContainer.getDeliveryGroupMap().values().stream().filter(dg -> { 
       Sets.SetView<Long> intersection = Sets.intersection(Sets.newHashSet(dg.getPlacements()), Sets.newHashSet(placementsToChangeStatusToPublish)); 
       return intersection.size()>0; 
     } 
); 
+0

「パーツ」は整数ですか?興味深いアプローチ;-) – GhostCat

+0

これは例です。 Idsは部品を指しています。 – Jeb

答えて

4

あなたがフィルタ簡素化することができます:

List<Train> = 
    trainMap().values() 
       .stream() 
       .filter(t-> t.getTrainParts().stream().anyMatch(p->blueParts.contains(p))) 
       .collect(Collectors.toList());  

をそして、あなたはbluePartsを変更することができた場合blueParts.contains()ではなく、線形の一定の時間が必要となることから、あなたのコードは、より速く実行します代わりにListHashSetをします時間。

+1

述語として 'blueParts :: contains'を使うことができます。これらのIntegerが連続した値の範囲にある場合(IDが通常そうするように)、 'HashSet'の代わりに' BitSet'を使うことも考えられます。 – Holger

0

あなたの質問に基づいて:「地図を繰り返して、少なくとも1つの青い部分を持つすべての列車を収集したい」私はあなたが青いリストで少なくとも1つの要素を持っている列車を探していると思います、以下はあなたができることです。

List<Train> trainList = trainMap.values().stream().filter(t -> t.getBlueParts().size()>0).collect(Collectors.toList());

関連する問題