Konvertering mellem stream og array i Java

1. Introduktion

Det er almindeligt at skulle konvertere forskellige dynamiske datastrukturer til arrays.

I denne vejledning demonstrerer vi, hvordan man konverterer en Strøm til en matrix og omvendt i Java.

2. Konvertering af en Strøm til en matrix

2.1. Metode Reference

Den bedste måde at konvertere en Strøm i en matrix er at bruge Strøm's toArray () metode:

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

Nu kan vi nemt 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-udtryk

En anden ækvivalent er til videregive et lambda-udtryk til toArray() metode:

offentlig statisk streng [] ved hjælp af Lamda (Stream stringStream) {return stringStream.toArray (størrelse -> ny streng [størrelse]); }

Dette ville give os det samme resultat som ved brug af metodehenvisningen.

2.3. Brugerdefineret klasse

Eller vi kan gå helt ud og oprette en fuld klasse.

Som vi kan se fra Strøm dokumentation, det tager en IntFunktion som et argument. Det tager matrixstørrelsen som input og returnerer en matrix af den størrelse.

Selvfølgelig, IntFunktion er en grænseflade, så vi kan implementere den:

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

Vi kan derefter konstruere og bruge som normalt:

offentlig streng [] ved hjælp af CustomClass (Stream stringStream) {return stringStream.toArray (ny MyArrayFunction ()); }

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

2.4. Primitive arrays

I de foregående afsnit undersøgte vi, hvordan man konverterer en String Stream til en Snor array. Faktisk kan vi udføre konverteringen på denne måde for enhver Objekt og det ville ligne meget på Snor eksempler ovenfor.

Det er dog lidt anderledes for primitiver. Hvis vi har en Strøm af Heltals som vi vil konvertere til int []for eksempel skal vi først kalde mapToInt () metode:

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

Der er også mapToLong () og mapToDouble () metoder til vores rådighed. Bemærk også, at vi ikke sendte noget argument til toArray () denne gang.

Endelig lad os gøre ligestillingspåstanden og bekræfte, at vi har vores int array korrekt:

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

Men hvad hvis vi har brug for at gøre det modsatte? Lad os se.

3. Konvertering af en matrix til en Strøm

Vi kan selvfølgelig også gå den anden vej. Og Java har nogle dedikerede metoder til det.

3.1. Array af Objekts

Vi kan konvertere arrayet til en Strøm ved brug af Arrays.stream () eller Stream.of () metoder:

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

Vi skal bemærke, at i begge tilfælde er vores Strøm er på samme tid som vores array.

3.2. Array of Primitives

På samme måde kan vi konvertere en række primitiver:

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

Men i modsætning til konvertering Objekts arrays, er der en vigtig forskel. Ved konvertering af primitives array, Arrays.stream () vender tilbage IntStream, mens Stream.of () vender tilbage Strøm.

3.3. Arrays.stream vs. Stream.of

For at forstå forskellene, der er nævnt i tidligere afsnit, ser vi på implementeringen af ​​de tilsvarende metoder.

Lad os først kigge på Java's implementering af disse to metoder:

public Stream stream (T [] array) {retur stream (array, 0, array.length); } offentlig strøm af (T ... værdier) {return Arrays.stream (værdier); }

Det kan vi se Stream.of () ringer faktisk Arrays.stream () internt, og det er naturligvis grunden til, at vi får de samme resultater.

Nu skal vi tjekke metoderne i tilfældet, når vi vil konvertere en række primitiver:

offentlig IntStream-stream (int [] array) {return stream (array, 0, array.length); } offentlig stream af (T t) {return StreamSupport.stream (nye Streams.StreamBuilderImpl (t), falsk); }

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

4. Konklusion

I denne artikel så vi, hvordan vi kan konvertere Strøms til arrays i Java og omvendt. Vi forklarede også, hvorfor vi får forskellige resultater, når vi konverterer en matrix af Objekts og når vi bruger en række primitiver.

Som altid kan komplet kildekode findes på GitHub.


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