Java: convertir matriz en flujo

En este tutorial, convertiremos un Java Array en un Java Stream. Esto se puede hacer para tipos y objetos primitivos, usando los métodos Arrays.stream() y Stream.of().

Introducción

En este tutorial, convertiremos un Java Array en un Java Stream para tipos primitivos, así como para objetos. Esto se puede hacer a través de Arrays.stream(), así como también Stream.of().

Arrays.stream()

Una buena forma de convertir un array en un stream es usar el método Arrays class' stream(). Esto funciona igual para tipos y objetos primitivos.

Tipos primitivos

Para tipos primitivos, puede usar Arrays.stream() con una referencia de matriz como parámetro.

Opcionalmente, también puede especificar el rango de índices que deben usarse como punto inicial y final de la secuencia/matriz. Si no se proporcionan, se convertirá toda la matriz:

1
2
3
4
5
// Entire array is used for constructing the Stream
Arrays.stream(T[] arr)  
// Construct Stream with a range of elements
Arrays.stream(T[] arr,int start_ind_Include,int end_ind_Exclude) 
)

Vamos a crear una instancia de una matriz y convertirla en una secuencia:

1
2
3
4
long[] array = {2, 5, 9, 10, 15, 18, 56};
LongStream stream = Arrays.stream(array);
System.out.println("Long stream:");
stream.forEach(x -> System.out.print(x + " "));

Esto resulta en:

1
2
Long stream: 
2 5 9 10 15 18 56 

De manera similar, podemos crear una secuencia a partir de un rango de índices (0,4) proporcionándolos como parámetros. Tenga en cuenta que el índice inicial del rango está incluido y el índice final no está incluido cuando se especifica un rango:

1
2
3
LongStream stream = Arrays.stream(array,0,4);
System.out.println("\nLong stream from index 0 to 3:");
stream.forEach(x -> System.out.print(x + " "));

Esto resulta en:

1
2
Long stream from index 0 to 3: 
2 5 9 10 

Objetos

Para los objetos, Arrays.stream() devuelve un Stream del objeto especificado. Acepta una referencia de matriz y, opcionalmente, toma un rango de índices. Hagamos una matriz String y convirtámosla en Stream:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
String[] array = new String[]{"John", "Jenny", "Martha", "Adam"};

// Create a Stream
Stream<String> stream = Arrays.stream(array);
System.out.println("Entire array:");
stream.forEach(c -> System.out.println(c));

// Create a Stream from a range
System.out.println("\nSubarray:")
Stream<String> streamWithRange = Arrays.stream(array,0,2);

El código anterior genera el siguiente resultado:

1
2
3
4
5
6
7
8
9
Entire array:
John
Jenny
Martha
Adam

Subarray:
John
Jenny

Stream.of()

Objetos primitivos

En lugar de usar la clase Arrays, también podemos usar la clase objetivo - Stream. El método of(), como su nombre lo indica, crea un Stream con una colección dada, como una matriz.

Tenga en cuenta que Stream.of() devuelve un flujo de objetos, independientemente del tipo que esté usando. Tendrás que aplanarlo para los tipos primitivos. La conversión/casting se realiza automáticamente para los objetos, ya que en ese caso, el método Stream.of() simplemente llama a Arrays.stream().

Hagamos una matriz int primitiva:

1
2
3
4
5
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Stream<int[]> stream = Stream.of(array);
System.out.println("\nInt stream: ");
// Need to be flattened to its primitive type
stream.flatMapToInt(Arrays::stream).forEach(x -> System.out.print(x + " "));

El aplanamiento se realiza a través del método Arrays.stream(), que en este caso solo agrega redundancia al código. En lugar de usar Stream.of() en arreglos primitivos, podemos usar clases integradas para estos, como IntStream.

Este código da como resultado:

1
2
Int stream: 
1 2 3 4 5 6 7 8 9

Objetos

Ahora, vamos a crear un Stream de tipo String. Luego filtraremos solo los nombres que comiencen con la letra 'J':

1
2
3
4
5
6
String[] array = new String[]{"John", "Jenny", "Martha", "Adam"};

Stream<String> stream = Stream.of(array);
System.out.println("Printing only names that start with 'J'...");
stream.filter(string -> string.startsWith("J"))
        .forEach(string -> System.out.pritnln(string));

El código tiene la siguiente salida:

1
2
3
Printing only names that start with 'J'...
John
Jenny

Conclusión

En este artículo, hemos cubierto las dos formas en que puede crear una secuencia a partir de una matriz. Esto se aplica tanto a las matrices primitivas como a las matrices de objetos.

El método Arrays.stream() es sencillo y acepta una referencia de matriz y un rango opcional. El método Stream.of() llama a Arrays.stream() para tipos de objetos, mientras que requiere aplanamiento para tipos primitivos.

Licensed under CC BY-NC-SA 4.0