Konvertere mellom Stream og Array i Java

1. Introduksjon

Det er vanlig å måtte konvertere forskjellige dynamiske datastrukturer til matriser.

I denne opplæringen vil vi demonstrere hvordan du konverterer en Strøm til en matrise og omvendt i Java.

2. Konvertering av a Strøm til en matrise

2.1. Metodehenvisning

Den beste måten å konvertere en Strøm i en matrise er å bruke Strøm's toArray () metode:

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

Nå kan vi enkelt teste om konverteringen var vellykket:

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

2.2. Lambda-uttrykk

En annen ekvivalent er til passere et lambdauttrykk til toArray() metode:

offentlig statisk streng [] ved hjelp av Lamda (Stream stringStream) {return stringStream.toArray (størrelse -> ny streng [størrelse]); }

Dette vil gi oss det samme resultatet som ved bruk av metodereferansen.

2.3. Egendefinert klasse

Eller vi kan gjøre alt for å lage en fullverdig klasse.

Som vi kan se fra Strøm dokumentasjon, det tar en IntFunction som argument. Det tar matrisestørrelsen som input og returnerer en matrise av den størrelsen.

Selvfølgelig, IntFunction er et grensesnitt slik at vi kan implementere det:

klasse MyArrayFunction implementerer IntFunction {@Override public String [] gjelder (int størrelse) {returner ny streng [størrelse]; }};

Vi kan deretter konstruere og bruke som normalt:

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

Derfor kan vi komme med samme påstand som tidligere.

2.4. Primitive arrays

I de forrige avsnittene undersøkte vi hvordan du konverterer en String Stream til en String array. Faktisk kan vi utføre konverteringen på denne måten for alle Gjenstand og det vil se veldig ut som String eksemplene ovenfor.

Det er imidlertid litt annerledes for primitiver. Hvis vi har en Strøm av Heltalls som vi vil konvertere til int [], for eksempel må vi først ringe mapToInt () metode:

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

Det er også mapToLong () og mapToDouble () metoder vi har til rådighet. Vær også oppmerksom på at vi ikke sendte noen argumenter til toArray () denne gangen.

Til slutt, la oss gjøre likestillingspåstanden og bekrefte at vi har vår int array riktig:

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

Hva om vi trenger å gjøre det motsatte, skjønt? La oss ta en titt.

3. Konvertere en matrise til en Strøm

Vi kan selvfølgelig også gå den andre veien. Og Java har noen dedikerte metoder for det.

3.1. Et utvalg av Gjenstands

Vi kan konvertere matrisen til en Strøm ved hjelp av Arrays.stream () eller Stream.of () metoder:

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

Vi bør merke oss at i begge tilfeller, vår Strøm er på samme tid som vårt utvalg.

3.2. Array of Primitives

På samme måte kan vi konvertere en rekke primitiver:

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

Men i motsetning til konvertering Gjenstands matriser er det en viktig forskjell. Når du konverterer primitives array, Arrays.stream () returnerer IntStream, samtidig som Stream.of () returnerer Strøm.

3.3. Arrays.stream vs. Stream.of

For å forstå forskjellene som er nevnt i tidligere seksjoner, tar vi en titt på implementeringen av de tilsvarende metodene.

La oss først ta en titt på Java's implementering av disse to metodene:

public Stream stream (T [] array) {retur stream (array, 0, array.length); } offentlig strøm av (T ... verdier) {retur Arrays.stream (verdier); }

Vi kan se det Stream.of () ringer faktisk Arrays.stream () internt og det er åpenbart grunnen til at vi får de samme resultatene.

Nå skal vi sjekke ut metodene i tilfelle når vi vil konvertere en rekke primitiver:

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

Denne gangen, Stream.of () ringer ikke til Arrays.stream ().

4. Konklusjon

I denne artikkelen så vi hvordan vi kan konvertere Strøms til matriser i Java og omvendt. Vi forklarte også hvorfor vi får forskjellige resultater når vi konverterer en rekke Gjenstands og når vi bruker en rekke primitiver.

Som alltid kan fullstendig kildekode finnes på GitHub.


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