Stream para Array: como parei de ter medo e aprendi a amar toArray() no Java 8

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

A pergunta eterna: como transformar um stream em um array?

\n\n

Olá, 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\n

Parece 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á!

\n\n

Índice (para navegação)

\n\n\n

Por que converter Stream em Array?

\n

Antes 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[] ou int[].
  • \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
\n

Portanto, saber transformar rapidamente um stream em array é uma habilidade básica para qualquer desenvolvedor Java. Vamos nessa!

\n\n

Método 1: toArray() — o mais simples (mas com pegadinha)

\n

Vamos começar pelo clássico. Todo Stream possui o método toArray(), que retorna um Object[]. Funciona assim:

\n\n
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\n

Funciona — mas há um detalhe. O tipo do array resultante é Object[], não String[]. Se você precisar exatamente de String[], terá que fazer um cast:

\n\n
String[] stringArray = (String[]) stream.toArray(); // ClassCastException!\n
\n\n

Erro! 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.

\n\n

Método 2: toArray(IntFunction) — os genéricos vêm ao resgate

\n

O 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.

\n\n

O exemplo mais claro é usar o construtor do array através de uma lambda:

\n\n
Stream<String> stream = Stream.of("Java", "Python", "Ruby");\nString[] array = stream.toArray(size -> new Str                

Blogs

Book Recommendations