¿Cómo convertir una secuencia de Java 8 a una matriz?

¿Cuál es la forma más fácil / más corta de convertir una Stream Java 8 en una matriz?

El método más fácil es usar el toArray(IntFunction generator) con una referencia de constructor de matriz. Esto se sugiere en la documentación de API para el método .

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

Lo que hace es encontrar un método que toma en un entero (el tamaño) como argumento, y devuelve un String[] , que es exactamente lo que (una de las sobrecargas de) new String[] hace.

También puede escribir su propia IntFunction :

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

El propósito del IntFunction generator es convertir un entero, el tamaño de la matriz, en una nueva matriz.

Código de ejemplo:

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

Huellas dactilares:

 a b c 

Si desea obtener una matriz de entradas, con valores del 1 al 10, de un Stream, IntStream está a su disposición.

Aquí creamos un Stream con un método Stream.of y convertimos un Stream en un IntStream usando un mapToInt. Entonces podemos llamar al método toArray de 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(); 

Aquí está lo mismo, sin Stream, usando solo IntStream

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

Puede convertir una secuencia Java 8 en una matriz con este simple bloque de código:

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

Pero expliquemos las cosas más, primero, creemos una lista de cadenas con tres valores:

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

Crea una transmisión desde la matriz dada:

 Stream stringStream = Arrays.stream(stringList); 

ahora podemos realizar algunas operaciones en esta secuencia Ex:

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

y finalmente conviértalo en un java 8 Array usando estos métodos:

1-Método clásico (interfaz funcional)

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

2 -Lambda expresión

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

3- Referencia del método

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

Explicación del método de referencia:

Es otra forma de escribir una expresión lambda que es estrictamente equivalente a la otra.

Puede crear un recostackdor personalizado que convierta una secuencia en una matriz.

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

y un uso rápido

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

El uso del toArray(IntFunction generator) es de hecho una forma muy elegante y segura de convertir (o más correctamente, recostackr) un Stream en un array del mismo tipo del Stream.

Sin embargo, si el tipo del conjunto devuelto no es importante, simplemente usar el método toArray() es más fácil y más corto. Por ejemplo:

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

Convierta el texto en una matriz de cadenas donde se separa cada valor por comas, y recorte cada campo, por ejemplo:

 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(); 

Puede hacerlo de varias maneras. Todas las formas son técnicamente las mismas, pero el uso de Lambda simplificará parte del código. Digamos que inicializamos una Lista primero con Cadena, llámala personas.

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

Ahora puede usar cualquiera de las siguientes formas.

1.Usar la función toArray () de la interfaz Stream que devuelve un Object [] y luego convertirlo a String [].

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

2.Utilizando Lambda Expresiion para crear un StringArray nuevo con un tamaño definido.

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

3. Usando el método de referencia directamente.

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