Átalakítás Stream és Array között Java-ban

1. Bemutatkozás

Gyakori, hogy különféle dinamikus adatstruktúrákat kell tömbekké konvertálni.

Ebben az oktatóanyagban bemutatjuk, hogyan lehet a Folyam tömbhöz és fordítva Java-ban.

2. Konvertálás a Folyam egy tömbhöz

2.1. Módszer referencia

A konverzió legjobb módja a Folyam tömbbe kell használni Folyam's array () módszer:

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

Most könnyen tesztelhetjük, hogy az átalakítás sikeres volt-e:

Stream stringStream = Stream.of ("baeldung", "convert", "to", "string", "array"); assertArrayEquals (új String [] {"baeldung", "convert", "to", "string", "array"}, aMethodReference (stringStream) használatával);

2.2. Lambda kifejezés

Egy másik megfelelője az adja át a lambda kifejezést hoz array() módszer:

public static String [] usingLambda (Stream stringStream) {return stringStream.toArray (méret -> új String [méret]); }

Ez ugyanazt az eredményt adná nekünk, mint a módszer referencia használatakor.

2.3. Egyéni osztály

Vagy kimenhetünk egy teljes osztályt létrehozni.

Amint a Folyam dokumentációhoz szükséges IntFunction érvként. A tömb méretét veszi bemenetként, és egy akkora tömböt ad vissza.

Természetesen, IntFunction egy felület, így megvalósíthatjuk:

class MyArrayFunction implementálja az IntFunction {@Orride public String [] alkalmazást (int size) {return new String [size]; }};

Ezután elkészíthetjük és használhatjuk a szokásos módon:

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

Következésképpen ugyanazt állíthatjuk, mint korábban.

2.4. Primitív tömbök

Az előző szakaszokban azt vizsgáltuk, hogyan lehet a String Stream a Húr sor. Valójában bármelyikre elvégezhetjük az átalakítást Tárgy és nagyon hasonlítana a Húr fenti példák.

A primitíveknél azért ez kicsit más. Ha van egy Folyam nak,-nek Egész száms amelyekre át akarunk térni int []például először meg kell hívnunk a mapToInt () módszer:

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

Van még mapToLong () és mapToDouble () rendelkezésünkre álló módszerek. Kérjük, vegye figyelembe, hogy egyetlen argumentumot sem adtunk át a array () ezúttal.

Végül tegyük meg az egyenlőség érvényesítését és erősítsük meg, hogy megvan a miénk int tömb helyesen:

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

Mi van, ha mégis az ellenkezőjét kell tennünk? Lássuk.

3. Tömb konvertálása a-ra Folyam

Természetesen mehetünk a másik úton is. És a Java rendelkezik néhány dedikált módszerrel erre.

3.1. Tömb Tárgys

Konvertálhatjuk a tömböt a-ra Folyam felhasználásával Tömbök.stream () vagy Stream.of () mód:

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

Meg kell jegyeznünk, hogy mindkét esetben a mi Folyam tömbünkkel egyidõs.

3.2. Primitívek tömbje

Hasonlóképpen átalakíthatunk egy primitív tömböt:

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

De ellentétben az átalakítással Tárgys tömbök, van egy fontos különbség. A primitív tömb átalakításakor Tömbök.stream () visszatér IntStream, miközben Stream.of () visszatér Folyam.

3.3. Tömbök.folyam vs. Stream.of

A korábbi szakaszokban említett különbségek megértése érdekében megnézzük a megfelelő módszerek megvalósítását.

Először vessünk egy pillantást a Java e két módszer megvalósítására:

public Stream stream (T [] tömb) {return stream (tömb, 0, tömb.hossz); } public Stream of (T ... értékek) {return Arrays.stream (értékek); }

Ezt láthatjuk Stream.of () valójában hív Tömbök.stream () belsőleg, és nyilvánvalóan ez az oka annak, hogy ugyanazokat az eredményeket kapjuk.

Most megnézzük a módszereket abban az esetben, ha primitívek tömbjét akarjuk átalakítani:

nyilvános IntStream adatfolyam (int [] tömb) {visszatérő adatfolyam (tömb, 0, tömb.hossz); } (T t) nyilvános adatfolyam {return StreamSupport.stream (new Streams.StreamBuilderImpl (t), false); }

Ezúttal, Stream.of () nem hívja a Tömbök.stream ().

4. Következtetés

Ebben a cikkben láttuk, hogyan tudunk konvertálni Folyams tömbökre Java-ban és fordítva. Azt is elmagyaráztuk, hogy miért kapunk különböző eredményeket a tömb átalakításakor Tárgys amikor primitívek tömbjét használjuk.

Mint mindig, a teljes forráskód megtalálható a GitHubon.