2017-05-24 71 views
5

我對Java lambda表達式很陌生,我不確定是否可以實現: 我有一個對象列表,我想過濾它提取那些他們認爲是符合給定的條件,並把它們放在一個分隔的列表(這樣我就可以對其進行一些操作,保持了原有的列表未修改) 我想出了這一點: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 - 取決於你給出的論點。例如,收集(Collectors.toList())。 –

回答

5

假設你的建議有些擁有public Suggestion copy();方法(如實施Copyable<Suggestion>接口),你可以這樣做:

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

編輯:用拷貝構造函數:

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

感謝傑里米,它的工作就像一個魅力:) – motagirl2

+0

@OliverCharlesworth我在副本部分完全一致。不過,我有點不喜歡'建議:: new'縮短語法,即使編譯器(或任何細心的讀者)瞭解到,這是一個'UnaryOperator ',它可以很容易地與其他構造函數混淆。長版本更易讀IMO。 –

1

既然你說你有一個拷貝構造函數,僅僅是收集操作之前添加此得到複製的對象的列表:

.map(Suggestion::new)