2015-10-17 21 views
25

Durante lo scorrimento della documentazione per il pacchetto java.util, sono stato sorpreso di scoprire che Optional<T> e OptionalInt non hanno alcun rapporto tra loro. Questo sembra molto difficile da credere, poiché suggerisce che sono classi non correlate.FacoltativoInt vs Opzionale <Integer>

  1. Perché non hanno un'interfaccia comune, di classe, sono sotto-tipi, o qualcosa per rivelare il rapporto che hanno? (Sono molto classi simili quando si guardano i loro usi.)
  2. Inoltre, perché la necessità di un ulteriore OptionalInt classe? Perché non puoi semplicemente usare Optional<Integer>? Ho pensato che fosse dovuto al fatto che lo int è primitivo, ma non esiste lo OptionalChar, quindi sarebbe una scelta di progettazione incoerente.

risposta

16

Java 8 ha introdotto un intero lotto dedicato ai primitivi. La ragione è molto probabilmente che i primitivi di inscatolamento possono creare molte "scatole" di rifiuti.

Ad esempio questo

OptionalInt optionalFirst = IntStream 
    .range(0, 100) 
    .filter(i -> i % 23 > 7) 
    .findFirst(); 

Qui, una Optional<Integer> come risultato sarebbe incoerente. Anche i metodi come ifPresent(IntConsumer consumer) consentono quindi di rimanere nel mondo IntStream. Optional<Integer> costringerebbe a convertire (che si può fare facilmente, se si desidera)

Non v'è alcuna necessità di un sostegno speciale per char o short o byte perché tutti loro può essere rappresentato come int. Quello mancante è boolean ma non c'è molto che puoi fare in un flusso con loro poiché ci sono solo 2 valori.

1

OptionalInt è un valore di contenitore di tipo primitivo int. I tipi primitivi non possono essere utilizzati come parametri di tipo per classi generiche, quindi non è possibile che si tratti di una sottoclasse di Optional<T>.

+0

Quindi, perché non c'è "OptionalChar"? – Michael

+0

zapl ha risposto che nella domanda il commento. –

+0

Non riesco a capire perché 'Opzionale ' non è sufficiente. Puoi fare un esempio? – Michael

6

Ci deve essere una classe OptionalInt per gli stream di Java 8 per essere coerenti. Se date un'occhiata allo Stream class, vedrete che manyofthemethods restituire Optional<T>. Tuttavia, occuparsi di un Stream<Long> o di qualsiasi altro flusso di primitive è inesauribile, quindi esiste una classe IntStream e una classe LongStream che sostituisce l'oggetto con il suo valore unboxed. Per esempio, trovare la somma degli elementi di un Stream<Integer> non è banale, mentre per un IntStream, basta chiamare IntStream#sum

In queste classi, il JDK sostituisce utilmente Optional<T> con OptionalInt, OptionalLong, e così via.