Streamingek egyesítése Java-ban
1. Áttekintés
Ebben a rövid cikkben elmagyarázzuk a Java egyesítésének különböző módjait Patakok - ami nem túl intuitív művelet.
2. A Plain Java használata
A JDK 8 Folyam osztály hasznos statikus segédprogramokkal rendelkezik. Vizsgáljuk meg közelebbről a concat () módszer.
2.1. Kettő egyesítése Patakok
A 2-es kombinálás legegyszerűbb módja Folyams a statikus használat Stream.concat () módszer:
@Test public void whenMergingStreams_thenResultStreamContainsElementsFromBoth () {Stream stream1 = Stream.of (1, 3, 5); Stream stream2 = Stream.of (2, 4, 6); Stream resultStream = Stream.concat (stream1, stream2); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6), amelynek eredményekéntStream.collect (Collectors.toList ())); }
2.2. Többszörös egyesítése Folyams
Amikor 2-nél többet kell egyesítenünk Folyamok, a dolgok kissé összetettebbé válnak. Az egyik lehetőség az első két folyam összefűzése, majd az eredmény összefűzése a következővel és így tovább.
A következő kódrészlet ezt működés közben mutatja:
@Test public void given3Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); Stream stream2 = Stream.of (2, 4, 6); Stream stream3 = Stream.of (18, 15, 36); Stream resultStream = Stream.concat (Stream.concat (stream1, stream2), stream3); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36), resultStream.collect (Collectors.toList ())); }
Mint láthatjuk, ez a megközelítés több áramlat számára megvalósíthatatlanná válik. Természetesen létrehozhatunk köztes változókat vagy segítő módszereket az olvashatóság javítása érdekében, de itt van egy jobb lehetőség:
@Test public void given4Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); Stream stream2 = Stream.of (2, 4, 6); Stream stream3 = Stream.of (18, 15, 36); Stream stream4 = Stream.of (99); Stream resultStream = Stream.of (stream1, stream2, stream3, stream4) .flatMap (i -> i); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36, 99), amelynek eredményekéntStream.collect (Collectors.toList ())); }
Ami itt történik:
- Először létrehozunk egy újat Folyam a 4-et tartalmazó Folyamok, amelynek eredményeként a Folyam
- Aztán mi flatMap () ezt a Folyam az identitásfüggvény használatával
3. A StreamEx használata
A StreamEx egy nyílt forráskódú Java könyvtár, amely kibővíti a Java 8 Stream lehetőségeit. Használja a StreamEx osztály, mint a JDK-k továbbfejlesztése Folyam felület.
3.1. Összevonás Folyams
A StreamEx könyvtár lehetővé teszi számunkra a streamek egyesítését a mellékel() példány módszer:
@Test public void given4Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); Stream stream2 = Stream.of (2, 4, 6); Stream stream3 = Stream.of (18, 15, 36); Stream stream4 = Stream.of (99); Stream resultStream = StreamEx.of (stream1) .append (stream2) .append (stream3) .append (stream4); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36, 99), amelynek eredményekéntStream.collect (Collectors.toList ())); }
Mivel ez egy példányos módszer, könnyen összekapcsolhatjuk és több adatfolyamot is hozzáfűzhetünk.
Vegye figyelembe, hogy létrehozhatunk egy Lista ki a patakból a használatával toList () ha beírjuk a resultStream változó a StreamEx típus.
3.2. Patakok egyesítése a használatával előre ()
A StreamEx tartalmaz egy olyan metódust is, amely elemeket ad hozzá egymás elé előre ():
@Test public void given3Streams_whenPrepended_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of ("foo", "bar"); Stream openingBracketStream = Stream.of ("["); Patak bezárásaBracketStream = Stream.of ("]"); Stream resultStream = StreamEx.of (stream1) .append (closBracketStream) .prepend (openingBracketStream); assertEquals (Arrays.asList ("[", "foo", "bar", "]"), amelynek eredményekéntStream.collect (Collectors.toList ())); }
4. A Jooλ használata
A jOOλ egy JDK 8 kompatibilis könyvtár, amely hasznos kiterjesztéseket biztosít a JDK számára. A legfontosabb patakelvonást itt nevezzük Szekvencia. Ne feledje, hogy ez egy szekvenciális és rendezett adatfolyam, tehát hívás párhuzamos() nem lesz hatása.
4.1. Patakok egyesítése
Csakúgy, mint a StreamEx könyvtár, a jOOλ is rendelkezik mellékel() módszer:
@Test public void given2Streams_whenMerged_thenResultStreamContainsAllElements () {Stream seq1 = Stream.of (1, 3, 5); Stream seq2 = Stream.of (2, 4, 6); Streaming resultSeq = Seq.ofType (seq1, Integer.class) .append (seq2); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6), ígySeq.collect (Collectors.toList ())); }
Ezenkívül van egy kényelem toList () módszer, ha beírjuk a kapottSeq változó a jOOλ-hoz Szekvencia típus.
4.2. Patakok egyesítése előre ()
A várakozásoknak megfelelően, mivel egy mellékel() módszer létezik, van még egy előre () módszer a jOOλ-ban:
@Test public void given3Streams_whenPrepending_thenResultStreamContainsAllElements () {Stream seq = Stream.of ("foo", "bar"); Stream openingBracketSeq = Stream.of ("["); Patak bezárásaBracketSeq = Stream.of ("]"); Stream resultStream = Seq.ofType (seq, String.class) .append (closBracketSeq) .prepend (openingBracketSeq); Assert.assertEquals (Arrays.asList ("[", "foo", "bar", "]"), amelynek eredményekéntStream.collect (Collectors.toList ())); }
5. Következtetés
Láttuk, hogy a folyamok egyesítése viszonylag egyszerű a JDK 8 használatával. Ha sok összevonásra van szükségünk, előnyös lehet a StreamEx vagy a jOOλ könyvtár használata az olvashatóság érdekében.
A forráskódot a GitHubon találja meg.