A pergunta eterna: como transformar um stream em um array?
\n\nOlá, colega! Se você já programou em Java 8 ou superior, certamente já se deparou com esta situação: você tem um Stream — moderno, funcional e poderoso — mas de repente precisa de um bom e velho array. Talvez a API da biblioteca exija um array, ou você queira passar dados para um método que não lida bem com coleções. E então vem o bloqueio: "How can I convert a Java 8 Stream to an Array?" — sim, exatamente aquela pergunta que acumulou milhares de visualizações no Stack Overflow.
\n\nParece simples, não é? Mas existem nuances. Neste artigo, vamos abordar todas as formas: desde o simples toArray() até o uso avançado de referências a construtores. Você descobrirá por que stream.toArray() retorna Object[] e não String[], e como corrigir isso. Vamos lá!
Índice (para navegação)
\n- \n
- Por que converter Stream em Array? \n
- Método 1: toArray() — o mais simples (mas com pegadinha) \n
- Método 2: toArray(IntFunction) — os genéricos vêm ao resgate \n
- Método 3: toArray(String[]::new) — açúcar sintático \n
- Método 4: IntStream e arrays primitivos \n
- Erros típicos e como evitá-los \n
- Resumo: cola para cópia rápida \n
Por que converter Stream em Array?
\nAntes de mergulharmos no código, vamos entender a motivação. A Stream API é uma ferramenta poderosa para processamento de dados: filtragem, mapeamento, ordenação. Mas existem cenários onde o array é mais conveniente:
\n- \n
- Compatibilidade com código legado: métodos antigos geralmente aceitam apenas
String[]ouint[]. \n - Desempenho: em alguns casos, arrays são mais rápidos que listas, especialmente quando o tamanho é fixo. \n
- Trabalho com Varargs: métodos como
void doSomething(String... args)esperam um array. \n - Serialização JSON: muitas bibliotecas (ex.: Jackson) funcionam melhor com arrays. \n
Portanto, saber transformar rapidamente um stream em array é uma habilidade básica para qualquer desenvolvedor Java. Vamos nessa!
\n\nMétodo 1: toArray() — o mais simples (mas com pegadinha)
\nVamos começar pelo clássico. Todo Stream possui o método toArray(), que retorna um Object[]. Funciona assim:
Stream<String> stream = Stream.of("Java", "Python", "Ruby");\nObject[] array = stream.toArray();\n\n// Saída: [Java, Python, Ruby]\nSystem.out.println(Arrays.toString(array));\n\n\nFunciona — mas há um detalhe. O tipo do array resultante é Object[], não String[]. Se você precisar exatamente de String[], terá que fazer um cast:
String[] stringArray = (String[]) stream.toArray(); // ClassCastException!\n\n\nErro! O Java não consegue converter Object[] para String[] — são tipos diferentes. Portanto, toArray() sem parâmetros só serve quando você está disposto a trabalhar com Object[]. Mas isso é raro. O que fazer? Continue lendo.
Método 2: toArray(IntFunction) — os genéricos vêm ao resgate
\nO Java 8 nos presenteou com uma versão sobrecarregada de toArray(IntFunction<A[]> generator). Este método aceita uma função que cria um array do tipo desejado. IntFunction é uma interface funcional que recebe um int (tamanho do array) e retorna um array.
O exemplo mais claro é usar o construtor do array através de uma lambda:
\n\nStream<String> stream = Stream.of("Java", "Python", "Ruby");\nString[] array = stream.toArray(size -> new Str