2015-03-17 8 views
16

Perché non sembrano esserci metodi map()/flatMap() su OptionalInt o altri aromi primitivi opzionali?Posso non mappare/flatMap un OptionalInt?

Le operazioni di mappa stream() consentono la conversione tra oggetti e primitive. Ma perché Opzionale non sfruttare questo?

OptionalInt profileId = OptionalInt.of(124); 

Optional<Profile> profile = profileId.map(i -> getProfile(i)); //no such valid map() method! 
+0

Per qualsiasi motivo, hanno deciso di non includere tali operazioni nei sapori primitivi di Opzionale. –

+0

Ma cosa si fermerebbe dall'implementare un metodo che converte su OptionalInt su Opzionale? Stream fa qualcosa di simile, immagino. – tmn

+0

Forse è stato tralasciato per mantenerlo leggero poiché questo è il punto delle primitive? Dovrebbero esserci diverse varianti di metodi mappa e flatmap per adattare gli altri sapori primitivi opzionali e l'oggetto standard Opzionale. – tmn

risposta

5

optionals primitivi non hanno mappa, flatMap e filtro metodi di progettazione.

Inoltre, in base allo Java8 in Action p.305 non è necessario utilizzarli. La giustificazione dell'uso primitivo sui flussi sono i motivi delle prestazioni. In caso di un numero enorme di elementi, l'overhead di boxing/unboxing è significativo. Ma questo è insensato poiché c'è un solo elemento in Optional.

Inoltre, si consideri ad esempio:

public class Foo { 
    public Optional<Integer> someMethod() { 
     return Optional.of(42); 
    } 
} 

e l'uso come metodo di riferimento:

.stream() 
.map(Foo::someMethod) 

Se si cambia tipo di ritorno di someMethod per OptionalInt:

public OptionalInt someMethod() { 
    return OptionalInt.of(42); 
} 

Non è possibile usalo come riferimento al metodo e il codice non lo co mpile on:

.map(Foo::someMethod) 
+9

Non vedo il punto del tuo esempio. con 'someMethod' che restituisce' OptionalInt', puoi mapparlo, trasformerà un 'Stream ' in un 'Stream ' (al contrario di uno 'Stream >' nel primo caso). E l'argomento delle prestazioni non regge neanche. Le operazioni su 'Stream' e' Optional' riguardano anche la composizione. Posso 'stream.reduce (binOp).map (fun) 'su un' Stream', ma non posso farlo su un 'IntStream'. La mancanza di coerenza è fastidiosa. Almeno ci potrebbe essere stato un ' opzionale boxed()' come c'è in 'IntStream' ... – Xavier

2

Sembra in Java 9 OptionalInt avrà un metodo stream che ti dà un IntStream con 0 o 1 elemento in esso. Su questo flusso è possibile utilizzare naturalmente map(), flatMap() o filter(), ecc

Per Java 8 Non ho nulla da aggiungere a user2138356’s answer.

Problemi correlati