2014-12-31 44 views
5

Poniższy kod przekształca listę obiektów na listę obiektów opcjonalnych. Czy istnieje elegancki sposób na to, używając strumieni Java 8?Konwertowanie listy obiektów na listę obiektów opcjonalnych w Javie

List<Object> originalList = Arrays.asList(new Object(), new Object()); 
List<Optional<Object>> convertedList = new ArrayList<>(); 
for (Object object : originalList) { 
    convertedList.add(Optional.of(object)); 
} 

Próbowałem następujący fragment kodu.

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

Jednak to daje następujący błąd kompilacji:

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

to przy użyciu klasy java.util.Optional raczej niż jedną Guava.

Odpowiedz

8

Zapomniałeś zebrać elementy z Stream na liście. Powinno być:

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 

Należy pamiętać, że można uniknąć utworzenia lamdba i używać Referencyjna metoda w tym przypadku z .map(Optional::of).

Nie widzę powodu, aby uzyskać List z List z Optional, jeśli wiesz z góry, że elementy na liście mają wartość inną niż null. Być może chodziło o to, aby w praktyce korzystać z Java 8, ale jako @Eran powiedział zamiast tego należy użyć Optional::ofNullable.

+0

Dzięki za odpowiedź. Zredukuję kod dla celów przykładu. Lista convertList będzie zawierała nieobecne wartości po tym w moim przypadku użycia, a element originalList nie zawiera wartości null. – kentsurrey

+2

Chociaż polecam metodę ref do formy w postaci lambda, nie oszukuj się, że "unikasz tworzenia lambda" za pomocą formularza referencyjnego metody. Refs metod są konwertowane do interfejsów funkcjonalnych za pomocą tych samych maszyn, co lambdas. Ale decyzje te powinny być podejmowane na podstawie czytelności kodu/łatwości konserwacji 99,999% czasu, więc powinieneś po prostu iść z tym, co jest bardziej czytelne - co jest na ogół metodą ref. –

4

Wygląda jakbyś zapomniał odebrać strumień do listy:

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

Należy użyć ofNullable chociaż, ponieważ of wymagane non obiekt zerowy (będzie rzucać NullPointerException kiedy minął pustą referencję).

+0

Dzięki za odpowiedź. To dobry punkt w metodzieNullable, jednak w tym przypadku wiem, że moja lista nie zawiera wartości null - jest to tylko po tym fragmencie kodu, że dodaję nieobecne wartości do nowej listy. – kentsurrey

Powiązane problemy