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.