2017-05-24 4 views
5

私はJava lambdasにはかなり新しく、私が望むものが達成できるかどうかはわかりません: 私はフィルタリングしたいオブジェクトのリストを持っています与えられた条件に合致していることを、それらのものをを抽出し、 を区切ったリストに入れて(私はそのまま元のリストを保持し、それらにいくつかの操作を行うことができます)私はこの思い付いた:Java lambdas:リストから新しいリストにノードをコピー

List<Suggestion> only_translations = original_list.stream(). 
    filter(t -> t.isTranslation). 
    collect(Collectors.toCollection(() -> new ArrayList<Suggestion>())); 

しかし、たとえ新しいリストオブジェクトを取得している場合、ノードは元のリストオブジェクトにリンクされているように見えます(元のリストからコピーされた新しいオブジェクトではなく参照によって)。したがって、新しいリストのオブジェクトを変更すると、 。

これを実現するには、lambdaを使用することが可能かどうかを知りたいと思います。すべての要素を反復する「古典的」な方法で行うことができます。 ありがとうございます!あなたの提案を仮定

+0

'collect()'は、可変縮小のためのものです。 –

+0

そう...代わりに何を使うべきですか? – motagirl2

+1

@JudeNiroshan - あなたがそれをどのような引数で与えるかによって異なります。 'collect(Collectors.toList())'などです。 –

答えて

5

多少(Copyable<Suggestion>インタフェースを実装するように)public Suggestion copy();メソッドを持って、あなたができる:

List<Suggestion> only_translations = original_list.stream() 
.filter(t -> t.isTranslation) 
.map(t -> t.copy())  // or .map(Suggestion::copy) 
.collect(Collectors.toList())); 

EDIT:コピーコンストラクタを持つ:

List<Suggestion> only_translations = original_list.stream() 
.filter(t -> t.isTranslation) 
.map(t -> new Suggestion(t)) // or .map(Suggestion::new) 
.collect(Collectors.toList())); 
+3

これはそれぞれ 'Suggestion :: copy'または' Suggestion :: new'に短縮できます。 –

+1

ありがとうJeremy、それは魅力のように働いた:) – motagirl2

+0

@OliverCharlesworth私は完全にコピーの部分に同意する。しかし、コンパイラ(または注意深い読者)が 'UnaryOperator 'であることを理解しても、他のコンストラクタと簡単に混同する可能性があるので、 'Suggestion :: new'短縮構文は嫌です。長いバージョンはより読みやすいIMOです。 –

1

あなたが持っていると言うので、コピーコンストラクタを追加するだけで、コレクション操作の前にこれを追加して、コピーされたオブジェクトのリストを取得します。

.map(Suggestion::new) 
関連する問題