2017-05-24 22 views
5

Java lambdaları için oldukça yeni ve ne istediğimin mümkün olup olmadığından emin değilim: Filtrelemek istediğim nesnelerin bir listesi var Belirli bir koşul eşleşen olduğunu bunlardan olanlar ayıklamak ve bir ayrılmış liste koydu (yani değiştirilmemiş orijinal listeyi tutmak, onlara bazı işlemi gerçekleştirebilir) Ben bu geldi:Java lambdas: Listeden yeni bir listeye kopyalayın

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

Ama Yeni bir liste nesnesi alıyorum, düğümler orijinal olanlara (orijinal listeden kopyalanan yeni nesneler değil, referans olarak) bağlı gibi görünüyor, böylece yeni listedeki nesneleri değiştirmek orijinal nesnedeki nesneleri de değiştiriyor .

Yani, bunu başarmak mümkün olup olmadığını bilmek istiyorum (lambdalar kullanarak, tüm öğeleri yineleyerek "klasik" şekilde yapabilirim biliyorum), ve bu durumda, nasıl. Şimdiden teşekkürler!

+0

'toplaması()' değiştirilebilir bir azalma içindir. –

+0

öyleyse ... bunun yerine ne kullanmalıyım? – motagirl2

+1

@JudeNiroshan - Hangi argümanı verdiğinize bağlıdır. Örneğin (Collectors.toList()) 'toplayın. –

cevap

5

biraz (bir Copyable<Suggestion> arabirim uygulama gibi) public Suggestion copy(); yöntemi sahiptirler sizin Öneri varsayarsak, yapabileceği:

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

EDIT: kopya kurucu ile:

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

Sırasıyla "Öneri :: copy" veya "Öneri :: new" olarak kısaltılabilir. –

+1

Teşekkürler Jeremy, bir çekicilik gibi çalıştı :) – motagirl2

+0

@OliverCharlesworth Tamamen kopya parçası üzerinde katılıyorum. Ancak, derleyici (ya da herhangi bir dikkatli okuyucu) bir 'UnaryOperator '' olduğunu anlasa da, diğer kurucularla kolayca karıştırabilse de, 'Öneri' yeni kısaltma sözdizimini sevmiyorum. Uzun versiyon daha okunabilir IMO'dur. –

1

Eğer söylüyorlar yana Bir kopya kurucu, sadece kopyalanan nesnelerin bir listesini almak için toplama işleminden önce bunu ekleyin:

.map(Suggestion::new) 
İlgili konular