2017-05-09 13 views
2

私は与えられた名前のためColumnTagsのリストからcolumnSemanticTagsを取得したいクラス使用するJava 8作成するためのストリームとコレクション<Stream>

class ColumnTags { 
    String Name; 
    Collection<String> columnSemanticTags; 

    // constructor and getter and setters and other relevant attributes 
} 

を持っています。

public Collection<String> getTags(String colName, List<ColumnTags> colList) 
{ 
    Collection<String> tags = new ArrayList(); 
    for(ColumnTag col:colList){ 
     if(colName.equals(col.getName())){ 
       tags = col.getColumnSemanticTags(); 
       break; 
       } 
    } 
    return tags; 
} 

は、Javaストリームへのループを変換する次のように

対応する方法です。試しました

tags = colList.stream().filter(col -> colName.equals(col.getName())) 
        .map(col -> col.getColumnSemanticTags()) 
        .collect(Collectors.toCollection()); 

コンパイルエラーです。私は何がサプライヤであるべきかを認識していません。 ArrayList :: newを試してみました。 ArrayListにキャストしようとしましたが、成功しませんでした。 誰かが私に間違っていると思われるものや、このシナリオを処理するための予想される方法を教えてもらえますか? 解決策では、誰かが.collect()がこの解決策に取り組むのに間違った方法である理由を説明することができます。

+1

「Collections.emptyList()」ではなく、「ArrayList」を返す理由はありません。 – Holger

答えて

0
public Collection<String> getTags(String colName, List<ColumnTags> colList) { 
    return colList.stream().filter(col -> colName.equals(col.getName())) 
     .map(col -> col.getColumnSemanticTags()) 
     .findFirst().orElse(new ArrayList<>()); 
} 
2

簡単な方法は、Streamをフィルタリングして、探しているものを正確に見つけることです。それが見つかった場合、それを返し、そうでない場合は空のArrayListを返す:

return colList.stream() 
       .filter(c -> colName.equals(c.getName())) 
       .map(ColumnTag::getColumnSemanticTags) 
       .findFirst() 
       .orElseGet(ArrayList::new); 
+0

私の試行が間違っていた理由を説明できますか?なぜこのソリューションを解決するには.collect()を間違った方法で使用していたのですか? – Echo

+0

'Collectors#toCollection'を使用すると、' Collection > 'に' Stream'を収集し、 'Collection 'だけが必要です。 –

+0

私は休憩がない場合。フラットマップ()に続いてコレクションがあります。 – Echo

0

あなたが本当にcollectを使用したい場合は、flatMapを呼び出す必要があります。これはリストのすべてを(map(col -> col.getColumnSemanticTags())から来た)すべての項目を含む単一のストリームにマージします。

List<String> tags = colList.stream() 
       .filter(col -> colName.equals(col.getName())) 
       .map(col -> col.getColumnSemanticTags()) 
       .flatMap(collection -> collection.stream()) 
       .collect(Collectors.toList()); 
+2

最初の要素が見つかった後、forループからOPがブレークします。 –

+0

実際、これはcollect()を使用するための回避策に過ぎません。 – csenga

関連する問題