Streams samenvoegen in Java

1. Overzicht

In dit korte artikel leggen we verschillende manieren uit om Java samen te voegen Streams - wat niet erg intuïtief is.

2. Gebruik gewoon Java

De JDK 8 Stroom class heeft een aantal handige statische hulpprogramma's. Laten we de concat () methode.

2.1. Twee samenvoegen Streams

De eenvoudigste manier om te combineren 2 Strooms is om de static te gebruiken Stream.concat () methode:

@Test openbare leegte 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), resulterendeStream.collect (Collectors.toList ())); } 

2.2. Meerdere samenvoegen Strooms

Wanneer we meer dan 2 moeten samenvoegen Streams, dingen worden een beetje ingewikkelder. Een mogelijkheid is om de eerste twee streams samen te voegen, vervolgens het resultaat samen te voegen met de volgende, enzovoort.

Het volgende codefragment laat dit in actie zien:

@Test openbare leegte gegeven3Streams_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), resulterendeStream.collect (Collectors.toList ())); } 

Zoals we kunnen zien, wordt deze benadering onhaalbaar voor meer streams. Natuurlijk kunnen we tussenliggende variabelen of hulpmethoden maken om het leesbaarder te maken, maar hier is een betere optie:

@Test openbare ongeldig gegeven4Streams_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), resulterendeStream.collect (Collectors.toList ())); } 

Wat hier gebeurt, is:

  • We maken eerst een nieuw Stroom met de 4 Streams, wat resulteert in een Stroom
  • Dan gaan we flatMap () dit in een Stroom met behulp van de identiteitsfunctie

3. StreamEx gebruiken

StreamEx is een open-source Java-bibliotheek die de mogelijkheden van Java 8 Streams uitbreidt. Het maakt gebruik van de StreamEx klasse als een verbetering van de JDK's Stroom koppel.

3.1. Samenvoegen Strooms

Met de StreamEx-bibliotheek kunnen we streams samenvoegen met behulp van de toevoegen () instantiemethode:

@Test openbare ongeldig gegeven4Streams_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 resulterendeStream = StreamEx.of (stream1) .append (stream2) .append (stream3) .append (stream4); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36, 99), resulterendeStream.collect (Collectors.toList ())); } 

Omdat het een instantiemethode is, kunnen we deze gemakkelijk koppelen en meerdere streams toevoegen.

Merk op dat we ook een Lijst uit de stream door toList () als we het resulterendeStream variabele naar de StreamEx type.

3.2. Streams samenvoegen met voorvoegen ()

StreamEx bevat ook een methode die elementen toevoegt vóór elkaar genaamd voorvoegen ():

@Test openbare leegte gegeven3Streams_whenPrepended_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of ("foo", "bar"); Stream openingBracketStream = Stream.of ("["); Stream closingBracketStream = Stream.of ("]"); Stream resulterendeStream = StreamEx.of (stream1) .append (closingBracketStream) .prepend (openingBracketStream); assertEquals (Arrays.asList ("[", "foo", "bar", "]"), resulterendeStream.collect (Collectors.toList ())); } 

4. Jooλ gebruiken

jOOλ is een JDK 8-compatibele bibliotheek die nuttige uitbreidingen biedt voor de JDK. De belangrijkste stroomonttrekking wordt hier genoemd Seq. Merk op dat dit een opeenvolgende en geordende stream is, dus bellen parallel() heeft geen effect.

4.1. Samenkomende stroompjes

Net als de StreamEx-bibliotheek heeft jOOλ een toevoegen () methode:

@Test openbare ongeldig gegeven2Streams_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), resulterendSeq.collect (Collectors.toList ())); } 

Er is ook een gemak toList () methode als we het resulterendeSeq variabele aan de jOOλ Seq type.

4.2. Streams samenvoegen met voorvoegen ()

Zoals verwacht, sinds een toevoegen () methode bestaat, is er ook een voorvoegen () methode in jOOλ:

@Test openbare leegte gegeven3Streams_whenPrepending_thenResultStreamContainsAllElements () {Stream seq = Stream.of ("foo", "bar"); Stream openingBracketSeq = Stream.of ("["); Stream closingBracketSeq = Stream.of ("]"); Stream resulterendeStream = Seq.ofType (seq, String.class) .append (closingBracketSeq) .prepend (openingBracketSeq); Assert.assertEquals (Arrays.asList ("[", "foo", "bar", "]"), resulterend in Stream.collect (Collectors.toList ())); } 

5. Conclusie

We zagen dat het samenvoegen van streams relatief eenvoudig is met JDK 8. Als we veel moeten samenvoegen, kan het voor de leesbaarheid nuttig zijn om de StreamEx- of jOOλ-bibliotheek te gebruiken.

Je kunt de broncode vinden op GitHub.