Konverzia medzi prúdom a poľom v Jave

1. Úvod

Je bežné, že je potrebné prevádzať rôzne dynamické dátové štruktúry do polí.

V tomto výučbe si ukážeme, ako previesť súbor Prúd do poľa a naopak v Jave.

2. Konverzia a Prúd do poľa

2.1. Referenčná metóda

Najlepší spôsob, ako previesť a Prúd do poľa je použiť Prúd's toArray () metóda:

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

Teraz môžeme ľahko otestovať, či bola konverzia úspešná:

Stream stringStream = Stream.of ("baeldung", "prevádzať", "na", "reťazec", "pole"); assertArrayEquals (nový reťazec [] {"baeldung", "konvertovať", "na", "reťazec", "pole"}, usingMethodReference (stringStream));

2.2. Lambda výraz

Ďalším ekvivalentom je odovzdať výraz lambda do toArray() metóda:

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

To by nám prinieslo rovnaký výsledok ako pri použití odkazu na metódu.

2.3. Vlastná trieda

Alebo môžeme ísť naplno a vytvoriť plnohodnotnú triedu.

Ako vidíme z Prúd dokumentácia, trvá to IntFunction ako argument. Berie veľkosť poľa ako vstup a vracia pole tejto veľkosti.

Samozrejme, IntFunction je rozhranie, aby sme ho mohli implementovať:

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

Potom môžeme zostrojiť a použiť ako obvykle:

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

V dôsledku toho môžeme uplatniť rovnaké tvrdenie ako predtým.

2.4. Primitívne polia

V predchádzajúcich častiach sme skúmali, ako previesť a Reťazcový prúd do a String pole. V skutočnosti môžeme vykonať konverziu týmto spôsobom pre kohokoľvek Objekt a vyzeralo by to veľmi podobne ako String príklady vyššie.

U primitívov je to však trochu iné. Ak máme a Prúd z Celé číslos na ktorú chceme konvertovať int [], napríklad, najskôr musíme zavolať na mapToInt () metóda:

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

Je tu tiež mapToLong () a mapToDouble () metódy, ktoré máme k dispozícii. Upozorňujeme tiež, že sme neprešli so žiadnym argumentom toArray () tentokrát.

Na záver urobíme tvrdenie o rovnosti a potvrdíme, že máme svoje int pole správne:

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

Čo ak však musíme urobiť opak? Pozrime sa.

3. Konverzia poľa na a Prúd

Môžeme samozrejme ísť aj opačnou cestou. A Java má na to niekoľko vyhradených metód.

3.1. Pole z Objekts

Pole môžeme previesť na a Prúd použitím Arrays.stream () alebo Stream.of () metódy:

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

Mali by sme poznamenať, že v obidvoch prípadoch je to naše Prúd je v rovnakom čase ako naše pole.

3.2. Pole primitívov

Podobne môžeme previesť rad primitívov:

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

Ale na rozdiel od prevádzania Objekts poľami, je tu dôležitý rozdiel. Pri prevode poľa primitívov Arrays.stream () vracia IntStream, zatiaľ čo Stream.of () vracia Prúd.

3.3. Polia.prúd vs. Stream.of

Aby sme pochopili rozdiely uvedené v predchádzajúcich častiach, pozrieme sa na implementáciu zodpovedajúcich metód.

Najprv sa pozrime na implementáciu týchto dvoch metód v Jave:

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

To vidíme Stream.of () skutočne volá Arrays.stream () interne a to je zjavne dôvod, prečo dosahujeme rovnaké výsledky.

Teraz si pozrieme metódy v prípade, že chceme previesť pole primitívov:

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

Tentokrát, Stream.of () nevolá Arrays.stream ().

4. Záver

V tomto článku sme videli, ako môžeme prevádzať Prúds do polí v Jave a naopak. Vysvetlili sme tiež, prečo dostávame rôzne výsledky pri prevode poľa Objekts a keď použijeme pole primitívov.

Kompletný zdrojový kód nájdete ako vždy na serveri GitHub.


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