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 aListinterface? 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()RArrayList<Integer><R, A>
Collectors.toList(), neste caso, retorna um ArrayList<Integer>" Ele pode não retornar um ArrayList. A Listimplementaçã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 ArrayListou 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.Ao 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.