Zlúčenie streamov v Jave

1. Prehľad

V tomto rýchlom článku vysvetľujeme rôzne spôsoby zlúčenia Javy Prúdy - čo nie je veľmi intuitívne ovládanie.

2. Používanie obyčajnej Javy

JDK 8 Prúd trieda má niekoľko užitočných metód statického použitia. Poďme sa bližšie pozrieť na concat () metóda.

2.1. Zlúčenie dvoch Prúdy

Najjednoduchší spôsob kombinácie 2 Prúds je použitie statickej Stream.concat () metóda:

@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), výslednýStream.collect (Collectors.toList ())); } 

2.2. Zlúčenie viacerých Prúds

Keď potrebujeme zlúčiť viac ako 2 Prúdy, veci sa stávajú o niečo zložitejšie. Jednou z možností je zreťaziť prvé dva prúdy, potom zreťaziť výsledok s ďalším a podobne.

Nasledujúci úryvok kódu to ukazuje v akcii:

@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 vyplývajúciStream = Stream.concat (Stream.concat (stream1, stream2), stream3); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36), výslednýStream.collect (Collectors.toList ())); } 

Ako vidíme, tento prístup je pre ďalšie prúdy nerealizovateľný. Samozrejme môžeme vytvoriť prechodné premenné alebo pomocné metódy, aby bola čitateľnejšia, ale tu je lepšia možnosť:

@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), výslednýStream.collect (Collectors.toList ())); } 

Tu sa deje:

  • Najprv vytvoríme nový Prúd obsahujúci 4 Prúdy, ktorého výsledkom je a Prúd
  • Potom my flatMap () toto do a Prúd pomocou funkcie identity

3. Používanie StreamEx

StreamEx je open-source knižnica Java, ktorá rozširuje možnosti tokov Java 8. Používa StreamEx triedy ako vylepšenie JDK Prúd rozhranie.

3.1. Zlúčenie Prúds

Knižnica StreamEx nám umožňuje zlúčiť prúdy pomocou pridať () metóda inštancie:

@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), výslednýStream.collect (Collectors.toList ())); } 

Pretože sa jedná o inštančnú metódu, môžeme ju ľahko zreťaziť a pridať viac prúdov.

Upozorňujeme, že by sme mohli vytvoriť aj Zoznam z toku pomocou listovať() ak napíšeme výsledný prúd premenná na StreamEx typu.

3.2. Zlúčenie streamov pomocou predstih ()

StreamEx tiež obsahuje metódu, ktorá pridáva prvky jeden pred druhým predstih ():

@Test public void given3Streams_whenPrepended_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of ("foo", "bar"); Stream openingBracketStream = Stream.of ("["); Stream closedBracketStream = Stream.of ("]"); Stream resultStream = StreamEx.of (stream1) .append (closedBracketStream) .prepend (openingBracketStream); assertEquals (Arrays.asList ("[", "foo", "bar", "]"), resultStream.collect (Collectors.toList ())); } 

4. Používanie Jooλ

jOOλ je knižnica kompatibilná s JDK 8, ktorá poskytuje užitočné rozšírenia JDK. Tu sa nazýva najdôležitejšia abstrakcia toku Sekv. Upozorňujeme, že toto je postupný a usporiadaný stream, teda volanie paralelné () nebude mať žiadny vplyv.

4.1. Zlúčenie streamov

Rovnako ako knižnica StreamEx, aj jOOλ má pridať () metóda:

@Test public void given2Streams_whenMerged_thenResultStreamContainsAllElements () {Stream seq1 = Stream.of (1, 3, 5); Stream seq2 = Stream.of (2, 4, 6); Stream resultSeq = Seq.ofType (seq1, Integer.class) .append (seq2); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6), výslednýSeq.collect (Collectors.toList ())); } 

Je tu aj pohodlie listovať() metóda, ak napíšeme výsledná sekv premenná na jOOλ Sekv typu.

4.2. Zlúčenie streamov s predstih ()

Podľa očakávania, keďže pridať () metóda existuje, existuje aj a predstih () metóda v jOOλ:

@Test public void given3Streams_whenPrepending_thenResultStreamContainsAllElements () {Stream seq = Stream.of ("foo", "bar"); Stream openingBracketSeq = Stream.of ("["); Stream closedBracketSeq = Stream.of ("]"); Stream výsledný prúd = Seq.ofType (seq, String.class) .append (closedBracketSeq) .prepend (openingBracketSeq); Assert.assertEquals (Arrays.asList ("[", "foo", "bar", "]"), resultStream.collect (Collectors.toList ())); } 

5. Záver

Videli sme, že zlúčenie streamov je pomocou JDK 8 relatívne jednoduché. Keď potrebujeme veľa zlúčiť, mohlo by byť výhodné kvôli čitateľnosti použiť knižnicu StreamEx alebo jOOλ.

Zdrojový kód nájdete na GitHub.


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