Conversione tra stream e array in Java

1. Introduzione

È normale che sia necessario convertire varie strutture di dati dinamici in array.

In questo tutorial, dimostreremo come convertire un flusso in un array e viceversa in Java.

2. Conversione di un flusso in un array

2.1. Riferimento al metodo

Il modo migliore per convertire un flusso in un array consiste nell'utilizzare flusso' s toArray () Metodo:

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

Ora possiamo facilmente verificare se la conversione ha avuto successo:

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

2.2. Espressione lambda

Un altro equivalente è passare un'espressione lambda al metodo toArray ():

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

Questo ci darebbe lo stesso risultato dell'utilizzo del metodo di riferimento.

2.3. Classe personalizzata

Oppure possiamo fare di tutto e creare una classe in piena regola.

Come possiamo vedere dalla documentazione di Stream , prende una IntFunction come argomento. Prende la dimensione dell'array come input e restituisce un array di quella dimensione.

Ovviamente, IntFunction è un'interfaccia quindi possiamo implementarla:

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

Possiamo quindi costruire e utilizzare normalmente:

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

Di conseguenza, possiamo fare la stessa affermazione di prima.

2.4. Array primitivi

Nelle sezioni precedenti, abbiamo esplorato come convertire uno String Stream in un array String . In effetti, possiamo eseguire la conversione in questo modo per qualsiasi oggetto e sarebbe molto simile agli esempi String sopra.

È un po 'diverso per i primitivi, però. Se abbiamo un flusso di Integer che vogliamo convertire in int [] , ad esempio, dobbiamo prima chiamare il metodo mapToInt () :

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

Ci sono anche i metodi mapToLong () e mapToDouble () a nostra disposizione. Inoltre, tieni presente che questa volta non abbiamo passato alcun argomento a toArray () .

Infine, facciamo l'asserzione di uguaglianza e confermiamo di aver ottenuto correttamente il nostro array int :

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

E se avessimo bisogno di fare il contrario, però? Diamo un'occhiata.

3. Conversione di un array in uno stream

Naturalmente possiamo anche andare dall'altra parte. E Java ha alcuni metodi dedicati per questo.

3.1. Array di oggetti s

Possiamo convertire l'array a un flusso utilizzando Arrays.stream () o Stream.of () metodi :

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

Dobbiamo notare che in entrambi i casi, il nostro Stream è della stessa ora del nostro array.

3.2. Array of Primitives

Allo stesso modo, possiamo convertire un array di primitive:

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

Ma, a differenza della conversione degli array di oggetti , c'è una differenza importante. Durante la conversione dell'array di primitive, Arrays.stream () restituisce IntStream , mentre Stream.of () restituisce Stream .

3.3. Arrays.stream e Stream.of

Per comprendere le differenze menzionate nelle sezioni precedenti, daremo un'occhiata all'implementazione dei metodi corrispondenti.

Diamo prima uno sguardo all'implementazione di Java di questi due metodi:

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

Possiamo vedere che Stream.of () sta effettivamente chiamando Arrays.stream () internamente e questo è ovviamente il motivo per cui otteniamo gli stessi risultati.

Ora, esamineremo i metodi nel caso in cui desideriamo convertire un array di primitive:

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

Questa volta, Stream.of () non chiama Arrays.stream () .

4. Conclusione

In questo articolo, abbiamo visto come convertire gli stream in array in Java e viceversa. Abbiamo anche spiegato perché otteniamo risultati diversi quando convertiamo un array di oggetti e quando usiamo un array di primitive.

Come sempre, il codice sorgente completo può essere trovato su GitHub.