Conversión entre flujo y matriz en Java

1. Introducción

Es común tener que convertir varias estructuras de datos dinámicas en matrices.

En este tutorial, demostraremos cómo convertir una secuencia en una matriz y viceversa en Java.

2. Conversión de una secuencia en una matriz

2.1. Referencia de método

La mejor manera de convertir una corriente en una matriz es el uso de la corriente' s toArray () método:

public String[] usingMethodReference(Stream stringStream) { return stringStream.toArray(String[]::new); }

Ahora, podemos probar fácilmente si la conversión fue exitosa:

Stream stringStream = Stream.of("baeldung", "convert", "to", "string", "array"); assertArrayEquals(new String[] { "baeldung", "convert", "to", "string", "array" }, usingMethodReference(stringStream));

2.2. Expresión Lambda

Otro equivalente es pasar una expresión lambda al método toArray ():

public static String[] usingLambda(Stream stringStream) { return stringStream.toArray(size -> new String[size]); }

Esto nos daría el mismo resultado que con el método de referencia.

2.3. Clase personalizada

O podemos hacer todo lo posible y crear una clase en toda regla.

Como podemos ver en la documentación de Stream , toma una IntFunction como argumento. Toma el tamaño de la matriz como entrada y devuelve una matriz de ese tamaño.

Por supuesto, IntFunction es una interfaz por lo que podemos implementarla:

class MyArrayFunction implements IntFunction { @Override public String[] apply(int size) { return new String[size]; } };

Luego podemos construir y usar como de costumbre:

public String[] usingCustomClass(Stream stringStream) { return stringStream.toArray(new MyArrayFunction()); }

En consecuencia, podemos hacer la misma afirmación que antes.

2.4. Matrices primitivas

En las secciones anteriores, exploramos cómo convertir una secuencia de cadenas en una matriz de cadenas . De hecho, podemos realizar la conversión de esta manera para cualquier Objeto y se vería muy similar a los ejemplos de cadenas anteriores.

Sin embargo, es un poco diferente para los primitivos. Si tenemos un Stream of Integer s que queremos convertir a int [] , por ejemplo, primero necesitamos llamar al método mapToInt () :

public int[] intStreamToPrimitiveIntArray(Stream integerStream) { return integerStream.mapToInt(i -> i).toArray(); }

También hay métodos mapToLong () y mapToDouble () a nuestra disposición. Además, tenga en cuenta que esta vez no pasamos ningún argumento a toArray () .

Finalmente, hagamos la aserción de igualdad y confirmemos que tenemos nuestra matriz int correctamente:

Stream integerStream = IntStream.rangeClosed(1, 7).boxed(); assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6, 7}, intStreamToPrimitiveIntArray(integerStream));

Sin embargo, ¿qué pasa si necesitamos hacer lo contrario? Vamos a ver.

3. Conversión de una matriz en una secuencia

Por supuesto, también podemos ir al otro lado. Y Java tiene algunos métodos dedicados para eso.

3.1. Matriz de objetos s

Podemos convertir la matriz a una corriente usando Arrays.stream () o Stream.of () métodos :

public Stream stringArrayToStreamUsingArraysStream(String[] stringArray) { return Arrays.stream(stringArray); } public Stream stringArrayToStreamUsingStreamOf(String[] stringArray) { return Stream.of(stringArray); }

Debemos tener en cuenta que en ambos casos, nuestro Stream es del mismo tiempo que nuestra matriz.

3.2. Matriz de primitivos

De manera similar, podemos convertir una matriz de primitivas:

public IntStream primitiveIntArrayToStreamUsingArraysStream(int[] intArray) { return Arrays.stream(intArray); } public Stream primitiveIntArrayToStreamUsingStreamOf(int[] intArray) { return Stream.of(intArray); }

Pero, a diferencia de la conversión de matrices de Object , existe una diferencia importante. Al convertir la matriz de primitivas, Arrays.stream () devuelve IntStream , mientras que Stream.of () devuelve Stream .

3.3. Arrays.stream frente a Stream.of

Para comprender las diferencias mencionadas en secciones anteriores, veremos la implementación de los métodos correspondientes.

Primero echemos un vistazo a la implementación de Java de estos dos métodos:

public  Stream stream(T[] array) { return stream(array, 0, array.length); } public  Stream of(T... values) { return Arrays.stream(values); }

Podemos ver que Stream.of () en realidad está llamando a Arrays.stream () internamente y esa es obviamente la razón por la que obtenemos los mismos resultados.

Ahora, revisaremos los métodos en el caso en que queramos convertir una matriz de primitivas:

public IntStream stream(int[] array) { return stream(array, 0, array.length); } public  Stream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderImpl(t), false); }

Esta vez, Stream.of () no llama a Arrays.stream () .

4. Conclusión

En este artículo, vimos cómo podemos convertir Stream s en matrices en Java y al revés. También explicamos por qué obtenemos resultados diferentes al convertir una matriz de Object sy cuando usamos una matriz de primitivas.

Como siempre, el código fuente completo se puede encontrar en GitHub.