Eu estava tentando converter uma matriz int em List e segui a rota desconhecida de usar o Java 8 Stream e criei essa
Arrays.stream(arr).boxed().collect(Collectors.toList());
Eu ainda tenho dificuldade para entender completamente essa linha, principalmente,
Por que
Collectors.toList()
, neste caso, retorna uma interface deArrayList<Integer>
implementaçãoList
? Por que nãoLinkedList<Integer>
ou qualquer outra classe genérica em conformidade com aList
interface? Não consigo encontrar nada sobre isso, exceto por uma breve menção de ArrayList aqui , na seção Notas da API.O que significa o painel esquerdo ? Obviamente é o tipo de retorno genérico ( no meu código aqui). E eu acho que é o argumento de tipo genérico do método, mas como eles são especificados? Olhei para Collector interface de doc e não foi capaz de absorvê-lo.
Stream.collect()
R
ArrayList<Integer>
<R, A>
Collectors.toList()
, neste caso, retorna um ArrayList<Integer>
" Ele pode não retornar um ArrayList
. A List
implementação é indefinida , portanto você não pode confiar em qual implementação ela retorna. Como o javadoc diz: "Não há garantias sobre o tipo , mutabilidade, serialização ou segurança de thread da Lista retornada;"
toList()
não está retornando um ArrayList
ou List
- está retornando a Collector
, que eventualmente criará e retornará a List
- também a documentação declara: "... Não há garantias quanto ao tipo , mutabilidade, serialização ou segurança de thread da Lista retornada; se for necessário mais controle sobre a lista retornada, use toCollection (Supplier) .... "
R
é o tipo genérico do tipo resultante.A
o tipo genérico do tipo de acumulação intermediária do coletor. Esse é o detalhe da implementação de como um coletor funciona. Ele divide e conquista, também para processamento paralelo, coleta primeiro em tipos intermediários.