2017-01-27 8 views
1

私はJava 8のリストストリーミングメソッドに変換したい非常に単純なコードスニペットを持っています。どんな助けでも本当に感謝しています。Java 8:Compare 2コレクションを別のプロパティを使用して別のコレクションを作成する

私は2つのコレクションを持っています.1つは文字列のセットで、もう1つは単純なPOJOのリストで、それ自体が文字列のリストで構成されています。

POJOサンプルIは、一度オブジェクトのリストの上に行くと、ちょうど名前がであるかどうかをチェックしませなぜ

Set<String> someStrings // Contains a list of strings that needs to be compared 

List<SimplePojo> pojoObjectList // Contains list of SimplePojo objects 

/* Each of someStrings need to be compared to each of SimplePojo.name property 
    and corresponding actions which is List object needs to be populated as a separate list 
    Below is the code snippet which has a mixture of Java 8 stream and regular For-Each loop 
*/ 
Set<String> desiredStrings = new HashSet<String>(); 

for(String s : someStrings) { 
    List<String> interimDesiredStrings = pojoObjectList.stream() 
              .filter(o -> StringUtils.equals(s, o.getName())) 
              .flatMap(o -> o.getDesiredStringList().stream()) 
              .collect(Collectors.toList()); 

    desiredStrings.addAll(interimDesiredStrings); 
} 

答えて

2

これは、サードパーティのユーティリティ機能を過度に使用することが原因であることを完全に示しています。

あなたはStringUtils.equalsを使用していますが、これがApache CommonsバージョンかSpringバージョン(またはそのような機能を持つ別のライブラリ)の兆候はありません。または、なぜこの特別な方法を使用しているのですか?

Apacheの場合、少なくともバージョン3で、CharSequenceを返すようにgetName()が宣言されている場合、Springの場合はまったく正当化されません。 Apacheの場合にはCharSequenceをサポートするだけでなく、nullを静かに処理するための両方のバリエーションが存在しますが、nullの扱いが本当に問題になる場合は、標準Objects.equalsを使用してください。多分、nullさえあなたが心配していません。

これは非常に重要である理由は、あなたのタスクを簡単に、標準的な平等の意味someStringsが最もSetの実装と同じように(合理的なルックアップ効率でSetを参照すると仮定すると

Set<String> desiredStrings = pojoObjectList.stream() 
    .filter(o -> someStrings.contains(o.getName())) 
    .flatMap(o -> o.getDesiredStringList().stream()) 
    .collect(Collectors.toSet()); 

を用いて実現することができるということです)、これはネストされた繰り返しよりも大幅に効率的です。 someStringsによって参照Setnullをサポートしていない場合getName()nullを返すことができれば、それは

.filter(o -> o.getName()!=null && someStrings.contains(o.getName())) 

にフィルタを変更、null名前はそれゆえ、「所望の」ではないことになる暗示すること

注これを明確な方法で解決してください。

+0

はい私はApache Lang3のStringUtilsを使っていました。述べているので、エラーを指摘してくれてありがとう。 他の人は同じ/類似のソリューションを提供していますが、私はこれを正しい答えとして受け入れて、他の人が利益を得ることができるように説明します。 ありがとうございました!!! – Sayantan

1

を変換したいと思っている

public class SimplePojo { 

    private long id; 
    private String name; 
    private List<String> desiredStringList; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<String> getDesiredStringList() { 
     return desiredStringList; 
    } 

    public void setDesiredStringList(List<String> desiredStringList) { 
     this.desiredStringList= desiredStringList; 
    } 

} 

比較:以下は、関連するコードです一致する名前のセット?

Set<String> desiredStrings = pojoObjectList.stream() 
    .filter(o -> someStrings.contains(o.getName())) 
    .flatMap(o -> o.getDesiredStringList().stream()) 
    .collect(toSet()); 
+0

ありがとうございます!しかし、私はHolgerの答えを受け入れています。それは彼が提案した標準的なやり方より多くの説明を提供しています。 – Sayantan

関連する問題