2017-01-17 13 views
4

ストリームを使用して以下の手順を実行することは可能ですか?Java 8ストリーム - ストリームを使用して同じタイプの複数のオブジェクトをリストにマップする

Set<Long> memberIds = new HashSet<>(); 
marksDistribution.parallelStream().forEach(marksDistribution -> { 
     memberIds.add(marksDistribution.getStudentId()); 
     memberIds.add(marksDistribution.getTeacherId()); 
     }); 

instanceDistribution.getStudentId()instanceDistribution.getTeacherId()はタイプLongの両方です。

このような質問が尋ねられる可能性がありますが、わかりません。シンプルなはいまたはいいえ。はい/いいえの場合、方法とビットの説明。 可能であれば、効率を議論してください。

答えて

4

あなたは3引数バージョンを使用することができますあなたが非スレッドセーフなコレクションに要素を並行して追加しているため、あなたの現在のバージョンが間違った結果になることがあります。だから、あなたはセット内で同じ値を何度も持っている可能性があります。

+0

問題について私が行ったことと比較して効率を議論できますか? –

+5

@ balboa_21問題はあなたがしたことに欠陥があることです。効率性を考える前に、正確性について考えるべきです。つまり、 'collect'を使うことはストリームを使って欲しいものを得る標準的な方法です。 –

+0

c:迅速な対応に感謝します。 Ok、おそらく、私はparallelStream()を使用していませんか? –

6

はい、あなたは複数の要素のStreamにあなたのStreamの単一の要素をマッピングして、単一Streamにそれらを平らにするflatMapを使用することができます。

Set<Long> memberIds = 
    marksDistribution.stream() 
        .flatMap (marksDistribution -> Stream.of(marksDistribution.getStudentId(), marksDistribution.getTeacherId())) 
        .collect(Collectors.toSet()); 
+0

あなたは私が問題にしたことと比較して効率を議論することができますか? –

+4

@Eran 1+は私から、まだjdk-9を持っていれば、flatMappingコレクターを使うことができます:list.stream()。collect(Collectors.flatMapping((MarksDistribution md) - > Stream.of(md.getStudentId() md.getTeacherId())、Collectors.toSet())); – Eugene

+1

@Eugeneニース、私はおそらくjdk-9をすぐに試してください。 – Eran

関連する問題