2015-04-01 11 views
5

Il javadoc of Spliterator (che è fondamentalmente ciò che è veramente dietro un Stream se ho capito le cose correttamente) definisce molti characeristics che abbiano un senso, come SIZED, CONCURRENT, IMMUTABLE eccPerché Spliterator <?> definisce NONNULL come una caratteristica?

ma definisce anche NONNULL; perché?

avrei però che sarebbe responsabilità dell'utente di assicurare che e che se, per esempio, uno sviluppatore ha cercato di .sort() un non SORTED torrente dove ci sono elementi nulli lui/lei avrebbe a buon diritto essere accolti con un NPE ...

Ma allora questa caratteristica esiste. Perché? Il Javadoc di Spliterator per sé non menziona alcun reale utilizzo di esso, e nemmeno la package-info.java del pacchetto java.util.stream ...

risposta

3

Dalla documentazione di Spliterator:

Uno Spliterator riporta anche una serie di characteristics() della sua struttura, fonte, e gli elementi tra ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT e SUBSIZED. Questi possono essere impiegati dai client Spliterator per controllare, specializzare o semplificare il calcolo.

Si noti che lo fa non parlare della prevenzione del NullPointerException s. Se si ordina uno Stream che potrebbe contenere valori è è la responsabilità di fornire un Comparator che può gestire null s.

La seconda frase indica chiaramente che l'utilizzo di questi flag è solo un'opzione, non un requisito per "Client Spliterator", che non è limitato all'utilizzo da parte di Stream s.


Quindi, indipendentemente dal fatto che sia utilizzato dalla corrente attuazione del Stream API, ci sono possibilità di ottenere un vantaggio della conoscenza di un NONULL caratteristica?

Penso di sì. Un'implementazione può diramarsi a un codice specializzato per un valore non nullSpliterator per utilizzare null per rappresentare un determinato stato quindi, ad es. valori assenti o il valore iniziale prima dell'elaborazione del primo elemento, ecc. Se in effetti, il codice di implementazione effettivo per la gestione di Stream s che può contenere nullè complicato. Ma ovviamente devi sempre valutare se la semplificazione di un caso giustifica la duplicazione del codice.

Ma a volte la semplificazione è così semplice come sapere che non ci sono null valori implica che è possibile utilizzare uno dei Concurrent… collezioni, che non consentono null s, internamente.

+0

Hmmwait ... Non ci sono 'Stream 'i client principali qui? Probabilmente ho una mentalità troppo ristretta, ma non vedo quali altri clienti potresti escogitare. Certo, puoi implementare il tuo (l'ho fatto), ma a parte usarlo in un 'Stream' ... – fge

+1

Non è" puoi implementare il tuo "un punto di forza, se non * il punto * di Java API, che ti supporta per scrivere la tua applicazione anziché fornire applicazioni complete? Oltre a ciò, 'Stream's sono i client principali, sì, ma ciò non è limitato all'implementazione * * * di' Stream's. Aggiungere una nuova caratteristica in una versione futura richiederebbe una versione maggiore, ma aggiungere un'implementazione che renda (migliore) l'uso di una bandiera già esistente può accadere in ogni piccolo aggiornamento. Quindi è una strategia ragionevole aggiungere bandiere con valore potenziale il prima possibile. – Holger

+0

Sì, sono d'accordo che è un punto di forza; Immagino di non essere abbastanza informato sulle decisioni di progettazione che stanno dietro: / – fge

0

ho trovato i seguenti commenti nel codice per l'enumerazione StreamOpFlag.

// The following Spliterator characteristics are not currently used but a 
// gap in the bit set is deliberately retained to enable corresponding 
// stream flags if//when required without modification to other flag values. 
// 
// 4, 0x00000100 NONNULL(4, ... 
// 5, 0x00000400 IMMUTABLE(5, ... 
// 6, 0x00001000 CONCURRENT(6, ... 
// 7, 0x00004000 SUBSIZED(7, ... 
+0

Uh, anche 'IMMUTABILE' e' CONCORRENTE'? Come si decide allora la parallelizzazione? Più va, più sono confuso:/ – fge