2015-06-16 8 views
13

Come convertire graziosamente la lista che contiene uno o zero elementi in Opzionale?Come convertire l'elenco di elementi singoli in java 8 opzionale

Il codice di brutto:

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

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

con Java 8, non è necessario più gli argomenti di tipo esplicite: 'Lista int = new ArrayList <>();' e 'opzionale opzionale = ints.isEmpty()? Optional.empty(): Optional.ofNullable (ints.get (0)); ' – Holger

+0

Thx, ho un livello di lingua errato :) – MariuszS

risposta

16

È possibile utilizzare il metodo Stream#findFirst(), che:

Restituisce un optional che descrive il primo elemento di questo flusso, o un optional vuota se il flusso è vuota .

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

In alternativa, con lo stesso successo è anche possibile utilizzare il metodo Stream#findAny().

+5

Nota che c'è una leggera differenza semantica: il codice della domanda usa' ofNullable' che implica che un 'Vuoto opzionale 'viene restituito se la lista non è vuota ma contiene un valore' Null' al primo posto. Al contrario 'Stream.findFirst()' genererà un'eccezione se è presente un elemento, ma 'null'. – Holger

+0

Bella presa, grazie. –

0

Prova in questo modo utilizzando il 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(); 
Problemi correlati