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 conformeListall'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()RArrayList<Integer><R, A>
Collectors.toList()in questo caso restituisce un ArrayList<Integer>" Potrebbe non restituire un ArrayList. L' Listimplementazione 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 ArrayListo 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.Ail 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.