2015-06-16 18 views
13

Jak ładnie przekonwertować listę zawierającą jeden lub zero elementów na Opcjonalne?Jak przekonwertować listę pojedynczych elementów na java 8 opcjonalnie

Kod brzydki:

List<Integer> integers = new ArrayList<>(); 

Optional<Integer> optional = integers.size() == 0 ? 
     Optional.empty() : 
     Optional.of(integers.get(0)); 
+1

Z Java 8, nie trzeba bezpośrednimi argumenty typu już: 'Lista ints = new ArrayList <>();' i 'Opcjonalnie opcjonalne = ints.isEmpty()? Opcjonalne.empty(): Opcjonalnie.Niewakup (ints.get (0)); ' – Holger

+0

Thx, mam nieprawidłowy poziom języka :) – MariuszS

Odpowiedz

16

Można użyć metody Stream#findFirst(), który:

zwraca Opcjonalnie opisująca pierwszy element tego strumienia lub pusty Opcjonalnie, jeśli strumień jest pusty .

List<Integer> list = ... 
Optional<Integer> optional = list.stream().findFirst(); 

Alternatywnie, z takim samym powodzeniem można również zastosować metodę Stream#findAny().

+5

Zauważ, że niewielka różnica semantyczna: kod pytania używa' ofNullable' co oznacza, że ​​puste 'Opcjonalne 'jest zwracane, jeśli lista nie jest pusta, ale zawiera' null' na pierwszym miejscu. Natomiast 'Stream.findFirst()' rzuci wyjątek, jeśli element jest obecny, ale 'null'. – Holger

+0

Fajny połów, dzięki. –

0

Spróbuj tak użyciu findFirst:

List<Integer> integers = new ArrayList<Integer>(); 
Optional<Integer> result = 
    integers.stream() 
      .map(this::resolve) 
      .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) 
      .findFirst(); 
Powiązane problemy