Stavo cercando di convertire un array int in List e ho preso la strada sconosciuta di utilizzo di Java 8 Stream e ho trovato questo
Arrays.stream(arr).boxed().collect(Collectors.toList());
Ho ancora difficoltà a comprendere appieno questa linea, principalmente,
Perché
Collectors.toList()
in questo caso restituisce un'interfaccia diArrayList<Integer>
implementazioneList
? Perché noLinkedList<Integer>
o qualsiasi altra classe generica conformeList
all'interfaccia? Non riesco a trovare nulla al riguardo, ad eccezione di una breve menzione di ArrayList qui , nella sezione Note API.Cosa significa il pannello di sinistra ? Ovviamente è il tipo di ritorno generico ( nel mio codice qui). E penso che sia l'argomento di tipo generico del metodo, ma come vengono specificati? Ho esaminato il documento dell'interfaccia di Collector e non sono riuscito ad assorbirlo.
Stream.collect()
R
ArrayList<Integer>
<R, A>
Collectors.toList()
in questo caso restituisce un ArrayList<Integer>
" Potrebbe non restituire un ArrayList
. L' List
implementazione non è definita , quindi non puoi fare affidamento su quale implementazione restituisce. Come dice javadoc : "Non ci sono garanzie sul tipo , la mutabilità, la serializzabilità o la sicurezza dei thread dell'elenco restituito;"
toList()
non sta restituendo un ArrayList
o List
- sta restituendo un Collector
, che alla fine creerà e restituirà un List
- anche la documentazione afferma: "... Non ci sono garanzie sul tipo , la mutabilità, la serializzazione o la sicurezza del thread dell'elenco restituito; se è necessario un maggiore controllo sull'elenco restituito, utilizzare toCollection (fornitore) .... "
R
è il tipo generico del tipo risultante.A
il tipo generico del tipo di accumulo intermedio del Collector. Questo è il dettaglio di implementazione di come funziona un collezionista: divide e conquista, anche per l'elaborazione parallela, raccoglie prima in tipi intermedi.