Como converter um stream de Java 8 para uma matriz?

Qual é a maneira mais fácil / mais rápida de converter um Stream Java 8 em um array?

O método mais fácil é usar o toArray(IntFunction generator) com uma referência de construtor de matriz. Isso é sugerido na documentação da API para o método .

 String[] stringArray = stringStream.toArray(String[]::new); 

O que ele faz é encontrar um método que considere um inteiro (o tamanho) como argumento e retorna um String[] , que é exatamente o que (uma das sobrecargas de) new String[] faz.

Você também pode escrever sua própria IntFunction :

 Stream stringStream = ...; String[] stringArray = stringStream.toArray(size -> new String[size]); 

O objective do IntFunction generator é converter um inteiro, o tamanho do array, em um novo array.

Exemplo de código:

 Stream stringStream = Stream.of("a", "b", "c"); String[] stringArray = stringStream.toArray(size -> new String[size]); Arrays.stream(stringArray).forEach(System.out::println); 

Impressões:

 a b c 

Se você deseja obter uma matriz de ints, com valores de 1 a 10, de um Stream, há o IntStream à sua disposição.

Aqui nós criamos um Stream com um método Stream.of e convertemos um Stream para um IntStream usando um mapToInt. Então podemos chamar o método toArray do IntStream.

 Stream stream = Stream.of(1,2,3,4,5,6,7,8,9,10); //or use this to create our stream //Stream stream = IntStream.rangeClosed(1, 10).boxed(); int[] array = stream.mapToInt(x -> x).toArray(); 

Aqui está a mesma coisa, sem o Stream, usando apenas o IntStream

 int[]array2 = IntStream.rangeClosed(1, 10).toArray(); 

Você pode converter um stream de java 8 em um array usando este bloco de código simples:

  String[] myNewArray3 = myNewStream.toArray(String[]::new); 

Mas vamos explicar mais as coisas, primeiro, vamos criar uma lista de string preenchida com três valores:

 String[] stringList = {"Bachiri","Taoufiq","Abderrahman"}; 

Crie um stream a partir da matriz fornecida:

 Stream stringStream = Arrays.stream(stringList); 

agora podemos realizar algumas operações nesse stream Ex:

 Stream myNewStream = stringStream.map(s -> s.toUpperCase()); 

e finalmente convertê-lo para uma matriz de java 8 usando estes methods:

Método 1-Clássico (interface funcional)

 IntFunction intFunction = new IntFunction() { @Override public String[] apply(int value) { return new String[value]; } }; String[] myNewArray = myNewStream.toArray(intFunction); 

Expressão 2-lambda

  String[] myNewArray2 = myNewStream.toArray(value -> new String[value]); 

3- Referência de método

 String[] myNewArray3 = myNewStream.toArray(String[]::new); 

Referência do método Explicação:

É outra maneira de escrever uma expressão lambda que é estritamente equivalente à outra.

Você pode criar um coletor personalizado que converta um stream em matriz.

 public static  Collector toArray( IntFunction converter ) { return Collectors.collectingAndThen( Collectors.toList(), list ->list.toArray( converter.apply( list.size() ) ) ); } 

e um uso rápido

 List input = Arrays.asList( ..... ); String[] result = input.stream(). .collect( CustomCollectors.**toArray**( String[]::new ) ); 

Usar o toArray(IntFunction generator) é de fato uma maneira muito elegante e segura de converter (ou mais corretamente, coletar) um Stream em um array do mesmo tipo do Stream.

No entanto, se o tipo da matriz retornada não for importante, simplesmente usando o método toArray() é mais fácil e mais curto. Por exemplo:

  Stream args = Stream.of(BigDecimal.ONE, "Two", 3); System.out.printf("%s, %s, %s!", args.toArray()); 

Converta texto em string array, separando cada valor por vírgula e apare cada campo, por exemplo:

 String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new); 
  Stream stream = Stream.of(1, 2, 3, 4, 5, 6); Integer[] integers = stream.toArray(it->new Integer[it]); 
 Stream stream = Stream.of(1, 2, 3, 4, 5, 6); int[] arr= stream.mapToInt(x->x.intValue()).toArray(); 

Você pode fazer isso de algumas maneiras. Todas as formas são tecnicamente as mesmas, mas usar o Lambda simplifica alguns dos códigos. Vamos dizer que inicializamos uma lista primeiro com String, chame de pessoas.

 List persons = new ArrayList(){{add("a"); add("b"); add("c");}}; Stream stream = persons.stream(); 

Agora você pode usar uma das seguintes maneiras.

1.Usando a function toArray () da interface Stream que retorna um Object [] e, em seguida, convertendo-o para String [].

 String[] stringArray = (String [])stream.toArray(); 

2.Usando o Lambda Expression para criar um novo StringArray com tamanho definido.

 String[] stringArray = stream.toArray(size->new String[size]); 

3. Usando a referência do método diretamente.

 String[] stringArray = stream.toArray(String[]::new);