Pretvaranje između streama i niza u Javi

1. Uvod

Uobičajeno je da različite dinamičke strukture podataka treba pretvoriti u nizove.

U ovom uputstvu pokazat ćemo kako pretvoriti Stream na niz i obrnuto u Javi.

2. Pretvaranje a Stream u niz

2.1. Referenca metode

Najbolji način za pretvorbu a Stream u niz je za upotrebu Prijenoss toArray () metoda:

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

Sada možemo lako testirati je li pretvorba bila uspješna:

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

2.2. Lambda Izraz

Drugi ekvivalent je proći lambda izraz prema toArray() metoda:

javni statički niz [] usingLambda (Stream stringStream) {return stringStream.toArray (veličina -> novi niz [veličina]); }

To bi nam dalo isti rezultat kao i pri korištenju reference metode.

2.3. Prilagođena klasa

Ili možemo izaći i stvoriti cjeloviti razred.

Kao što vidimo iz Stream dokumentacija, potrebno je IntFunction kao argument. Veličina polja uzima kao ulaz i vraća niz te veličine.

Naravno, IntFunction je sučelje pa ga možemo implementirati:

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

Tada možemo konstruirati i koristiti kao i obično:

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

Slijedom toga, možemo iznijeti istu tvrdnju kao i ranije.

2.4. Primitivni nizovi

U prethodnim odjeljcima istražili smo kako pretvoriti a String Stream do a Niz niz. Zapravo pretvorbu možemo izvršiti na ovaj način za bilo koga Objekt i izgledao bi vrlo slično Niz gornji primjeri.

Ipak je malo drugačije za primitivce. Ako imamo a Stream od Cijeli broju koje želimo pretvoriti int [], na primjer, prvo moramo nazvati mapToInt () metoda:

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

Tu je i mapToLong () i mapToDouble () metode kojima raspolažemo. Također, imajte na umu da nismo proslijedili nijedan argument toArray () ovaj put.

Na kraju, napravimo tvrdnju o jednakosti i potvrdimo da imamo svoje int niz ispravno:

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

Što ako ipak trebamo učiniti suprotno? Pogledajmo.

3. Pretvaranje niza u Stream

Možemo, naravno, ići i drugim putem. A Java za to ima neke namjenske metode.

3.1. Niz od Objekts

Polje možemo pretvoriti u Stream koristeći Nizovi.stream () ili Stream.of () metode:

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

Treba napomenuti da je u oba slučaja naš Stream je u isto vrijeme kad i naš niz.

3.2. Niz primitivaca

Slično tome, možemo pretvoriti niz primitiva:

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

Ali, za razliku od pretvaranja Objekts nizova, postoji važna razlika. Pri pretvaranju primitivnog niza, Nizovi.stream () vraća se IntStream, dok Stream.of () vraća se Stream.

3.3. Nizovi.tok nasuprot Stream.of

Kako bismo razumjeli razlike spomenute u prethodnim odjeljcima, pogledati ćemo provedbu odgovarajućih metoda.

Prvo zavirimo u Javinu implementaciju ove dvije metode:

javni tok streama (niz T []) {povratni tok (niz, 0, niz.duljina); } javni tok (T ... vrijednosti) {return Arrays.stream (values); }

To možemo vidjeti Stream.of () zapravo zove Nizovi.stream () interno i to je očito razlog zašto postižemo iste rezultate.

Sada ćemo provjeriti metode u slučaju kada želimo pretvoriti niz primitiva:

javni IntStream stream (int [] array) {return stream (array, 0, array.length); } javni tok (T t) {return StreamSupport.stream (novi Streams.StreamBuilderImpl (t), false); }

Ovaj put, Stream.of () ne zove Nizovi.stream ().

4. Zaključak

U ovom smo članku vidjeli kako možemo pretvoriti Streams na nizove na Javi i obrnuto. Također smo objasnili zašto dobivamo različite rezultate prilikom pretvaranja niza od Objekts i kada koristimo niz primitiva.

Kao i uvijek, potpuni izvorni kod možete pronaći na GitHubu.


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