2016-02-11 13 views
14

Sono stato sorpreso dal metodo Optional.ofNullable. Un giorno ho scritto una funzione che dovrebbe restituire un optional:Optional.of Nullable e concatenamento metodo

private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) { 
    return Optional.ofNullable(insight.getValues().get(0).getValue()); 
} 

ho erroneamente pensato che Optional.ofNullable impedirà qualsiasi NullPointerExceptions all'interno di espressione argomento.

Ora penso di sapere che è stata un'idea molto sciocca. Java deve risolvere gli argomenti prima di passarlo alla chiamata Optional.ofNullable.

Ma ho una domanda. C'è un modo bello e buono per raggiungere il mio obiettivo? Vorrei ottenere dall'espressione insight.getValues().get(0).getValue() un valore Integer o null. Null può essere ognuna delle espressioni: insight.getValues() o insight.getValues().get(0).

So che posso solo mettere questo in try/catch block ma mi chiedo se c'è una soluzione più elegante.

+0

Nel tuo caso 'insight' è nullo. È molto meglio non passare mai null ai metodi piuttosto che controllare i metodi null all'interno. –

risposta

20

Se non avete idea di che cosa può essere null, o voler controllare tutto per null, l'unico modo è quello di chiamate chain per Optional.map:

Se un valore è presente, applicare la funzione di mappatura fornita e, se il risultato è non nullo, restituire un Facoltativo che descrive il risultato. In caso contrario, restituire un Opzionale vuoto.

Come tale, se il ritorno mappatore null, sarà restituito un vuoto Optional, che permette di chiamate catena.

Optional.ofNullable(insight) 
     .map(i -> i.getValues()) 
     .map(values -> values.get(0)) 
     .map(v -> v.getValue()) 
     .orElse(0); 

La chiamata finale per orElse(0) permette di restituire il valore di default 0 eventuale mapping restituito null.

2

smth come questo dovrebbe funzionare

Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

bene, secondo il codice di esempio dato, come #extractFirstValueFrom non contengono né @Nullable né controlli per nulla come Guava di checkNotNull(), supponiamo che insight è sempre something. pertanto il wrapping di Optional.ofNullable(insight.getValues()) in Option non risulterebbe con NPE. quindi viene chiamata la catena di trasformazione delle chiamate (ogni risultato con Optional) che porta al risultato o Some o None.

Problemi correlati