2014-12-31 20 views
5

Aşağıdaki kod, nesne listesini isteğe bağlı nesneler listesine dönüştürür. Java 8'in akışlarını kullanarak bunu yapmak için şık bir yolu var mı? Aşağıdaki kod parçasını denedim.Nesnelerin bir listesini Java'daki isteğe bağlı nesnelerin listesine dönüştürme

of(T) in Optional cannot be applied to (java.lang.Object) 

Bu java.util.Optional sınıfı yerine Guava birini kullanıyor:

List<Optional<Object>> convertedList = originalList.stream().map((o) -> Optional.of(o)); 

Ancak bu şu derleme hatası verir.

cevap

8

Listede Stream öğelerini toplamayı unutmuşsunuzdur. Olması gereken: Bir lamdba oluşturulmasını önlemek ve .map(Optional::of) ile bu durumda bir yöntem başvuru kullanabilirsiniz

List<Optional<Object>> convertedList = originalList.stream() 
                .map((o) -> Optional.of(o)) 
                .collect(Collectors.toList()); 
               //or .collect(Collectors.toCollection(LinkedList::new)); if you want a specific List implementation 

Not.

Listedeki öğelerin boş olmadığını önceden biliyorsanız, neden 'un Optional alacağını anlamıyorum. Belki de sadece Java 8 ile pratik yapmak için oldu, ama @Eran yerine Optional::ofNullable kullanmanız gerektiğini söyledi. Bir listeye Akışı toplamak için unuttum gibi görünüyor

+0

Yanıt için teşekkürler. Örneğin amaçlarına göre kodu kesiyorum. ConvertedList, kullanım durumumda bundan sonra buna eklenmemiş değerlere sahip olacak ve originalList, boş değer içermiyor. – kentsurrey

+2

Yöntemin refa formunu lambda formu üzerinden tavsiye etmeme rağmen, metod referans formunu kullanarak "lambda yaratmayı önlemek" olduğunu kendinize kandırmayın. Metot referansları lambdalarla aynı makine ile fonksiyonel arayüzlere dönüştürülür. Ancak, bu kararlar, zamanın% 99,999'unun kod okunabilirliği/sürdürülebilirliği temelinde yapılmalıdır, bu yüzden daha okunabilir olanla devam etmelisiniz - bu genellikle yöntem ref. –

4

: of olmayan bir boş nesne gerekli beri

List<Optional<Object>> convertedList = 
    originalList.stream() 
       .map((o) -> Optional.ofNullable(o)) 
       .collect(Collectors.toList()); 

Sen (Boş bir başvuru geçirilen zaman bir NullPointerException atacağım) olsa ofNullable kullanmalıdır.

+0

Cevabınız için teşekkürler. Bu, NULLLE yöntemiyle ilgili iyi bir nokta, ancak bu durumda, listemi null içermediğini biliyorum - bu kod parçasından sonra yeni listeye yeni değerler ekleyeceğim. – kentsurrey

İlgili konular