2017-05-24 70 views
5

Jestem całkiem nowy w lambdach Java, i nie jestem pewien, czy to, co chcę, jest osiągalne: Mam listę obiektów, które chciałbym filtrować do wyodrębnić te z nich, które są dopasowane do danego stanu, i umieścić je w oddzielnym liście (więc mogę wykonać jakąś operację na nich, zachowując pierwotną listę niemodyfikowana) wymyśliłem to:Java lambdas: Skopiuj węzły z listy do nowej listy

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

Ale nawet jeśli otrzymuję nowy obiekt listy, węzły wydają się być połączone z pierwotnymi (przez odniesienie, a nie nowe obiekty skopiowane z pierwotnej listy), więc modyfikowanie obiektów na nowej liście modyfikuje również obiekty w pierwotnej liście .

Chciałbym wiedzieć, czy można to osiągnąć (używając lambdas, wiem, że mogę to zrobić "klasyczny" sposób iterowania wszystkich elementów) iw tym przypadku, w jaki sposób. Z góry dziękuję!

+0

'collect()' służy do zmiany wartości zmiennej. –

+0

więc ... czego powinienem użyć zamiast tego? – motagirl2

+1

@JudeNiroshan - Zależy od tego, jaką argumentujesz. 'collect (Collectors.toList())', na przykład. –

Odpowiedz

5

Zakładając swoje sugestie nieco posiadać metodę public Suggestion copy(); (jak wdrożenie interfejsu Copyable<Suggestion>), można zrobić:

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

EDIT: z konstruktora kopii:

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

Które można skrócić odpowiednio do 'Suggestion :: copy' lub' Suggestion :: new'. –

+1

Dzięki Jeremy, zadziałało jak urok :) – motagirl2

+0

@OliverCharlesworth Całkowicie się zgadzam na części do kopiowania. Jednak nie podoba mi się skrócona składnia 'Suggestion :: new', nawet jeśli kompilator (lub każdy uważny czytelnik) rozumie, że jest to" UnaryOperator ", można go łatwo pomylić z innymi konstruktorami. Długa wersja jest bardziej czytelna IMO. –

1

Skoro mówisz, że mają konstruktor kopiujący, dodaj to przed operacją zbierania, aby uzyskać listę skopiowanych obiektów:

.map(Suggestion::new)