Omzetten tussen stream en array in Java

1. Inleiding

Het is gebruikelijk om verschillende dynamische gegevensstructuren om te zetten in arrays.

In deze zelfstudie laten we zien hoe u een Stroom naar een array en vice versa in Java.

2. Omzetten van een Stroom naar een array

2.1. Methode referentie

De beste manier om een Stroom in een array is te gebruiken Stroom's toArray () methode:

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

Nu kunnen we eenvoudig testen of de conversie is geslaagd:

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

2.2. Lambda-expressie

Een ander equivalent is geef een lambda-uitdrukking door naar de toArray() methode:

openbare statische String [] usingLambda (Stream stringStream) {return stringStream.toArray (grootte -> nieuwe String [grootte]); }

Dit zou ons hetzelfde resultaat geven als bij het gebruik van de methodeverwijzing.

2.3. Aangepaste klasse

Of we kunnen alles uit de kast halen en een complete klas creëren.

Zoals we kunnen zien aan de Stroom documentatie, het duurt een IntFunctie als argument. Het neemt de array-grootte als invoer en retourneert een array van die grootte.

Natuurlijk, IntFunctie is een interface zodat we deze kunnen implementeren:

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

We kunnen dan zoals normaal construeren en gebruiken:

openbare String [] usingCustomClass (Stream stringStream) {return stringStream.toArray (nieuwe MyArrayFunction ()); }

Bijgevolg kunnen we dezelfde bewering doen als eerder.

2.4. Primitieve arrays

In de vorige secties hebben we onderzocht hoe u een String-stroom naar een Draad array. In feite kunnen we de conversie op deze manier uitvoeren voor elk Voorwerp en het zou erg lijken op de Draad voorbeelden hierboven.

Het is echter een beetje anders voor primitieven. Als we een Stroom van Geheel getals waarnaar we willen converteren int []we moeten bijvoorbeeld eerst de mapToInt () methode:

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

Er is ook mapToLong () en mapToDouble () methoden tot onze beschikking. Houd er ook rekening mee dat we geen enkel argument hebben doorgegeven aan de toArray () deze keer.

Laten we tot slot de gelijkheidsverklaring doen en bevestigen dat we de onze hebben int array correct:

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

Maar wat als we het tegenovergestelde moeten doen? Laten we kijken.

3. Een array omzetten in een Stroom

We kunnen natuurlijk ook de andere kant op gaan. En Java heeft daarvoor een aantal speciale methoden.

3.1. Matrix van Voorwerps

We kunnen de array converteren naar een Stroom gebruik makend van Arrays.stream () of Stroom van() methoden:

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

We moeten opmerken dat in beide gevallen onze Stroom is van dezelfde tijd als onze array.

3.2. Een reeks primitieven

Evenzo kunnen we een reeks primitieven converteren:

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

Maar in tegenstelling tot converteren Voorwerps arrays is er een belangrijk verschil. Bij het converteren van primitieven-array, Arrays.stream () geeft terug IntStream, terwijl Stroom van() geeft terug Stroom.

3.3. Arrays.stream vs. Stroom van

Om de verschillen te begrijpen die in eerdere secties zijn genoemd, zullen we de implementatie van de overeenkomstige methoden bekijken.

Laten we eerst eens kijken naar Java's implementatie van deze twee methoden:

openbare stroomstroom (T [] array) {retourstroom (array, 0, array.length); } openbare stroom van (T ... waarden) {terugkeer Arrays.stream (waarden); }

Dat kunnen we zien Stroom van() is eigenlijk aan het bellen Arrays.stream () intern en dat is duidelijk de reden waarom we dezelfde resultaten behalen.

Nu zullen we de methoden bekijken in het geval dat we een reeks primitieven willen converteren:

openbare IntStream-stream (int [] array) {retourstroom (array, 0, array.length); } openbare stroom van (T t) {terug StreamSupport.stream (nieuwe Streams.StreamBuilderImpl (t), false); }

Deze keer, Stroom van() roept niet de Arrays.stream ().

4. Conclusie

In dit artikel hebben we gezien hoe we kunnen converteren Strooms naar arrays in Java en andersom. We hebben ook uitgelegd waarom we verschillende resultaten krijgen bij het converteren van een reeks Voorwerps en wanneer we een reeks primitieven gebruiken.

Zoals altijd is de volledige broncode te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found