Menggabungkan Streaming di Java

1. Ikhtisar

Dalam artikel singkat ini, kami menjelaskan berbagai cara untuk menggabungkan Java Stream - yang bukan merupakan operasi yang sangat intuitif.

2. Menggunakan Plain Java

Kelas JDK 8 Stream memiliki beberapa metode utilitas statis yang berguna. Mari kita lihat lebih dekat metode concat () .

2.1. Menggabungkan Dua Aliran

Cara termudah untuk menggabungkan 2 Stream adalah dengan menggunakan metode Stream.concat () statis :

@Test public void whenMergingStreams_thenResultStreamContainsElementsFromBoth() { Stream stream1 = Stream.of(1, 3, 5); Stream stream2 = Stream.of(2, 4, 6); Stream resultingStream = Stream.concat(stream1, stream2); assertEquals( Arrays.asList(1, 3, 5, 2, 4, 6), resultingStream.collect(Collectors.toList())); } 

2.2. Penggabungan Beberapa Streaming s

Saat kami perlu menggabungkan lebih dari 2 Stream, semuanya menjadi sedikit lebih rumit. Salah satu kemungkinannya adalah menggabungkan dua aliran pertama, lalu menggabungkan hasilnya dengan aliran berikutnya dan seterusnya.

Cuplikan kode berikutnya menunjukkan ini dalam tindakan:

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

Seperti yang bisa kita lihat, pendekatan ini menjadi tidak layak untuk lebih banyak aliran. Tentu saja, kita dapat membuat variabel perantara atau metode pembantu agar lebih mudah dibaca, tetapi ini adalah opsi yang lebih baik:

@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 resultingStream = Stream.of( stream1, stream2, stream3, stream4) .flatMap(i -> i); assertEquals( Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), resultingStream.collect(Collectors.toList())); } 

Yang terjadi di sini adalah:

  • Kami pertama kali membuat Arus baru yang berisi 4 Arus, yang menghasilkan Arus
  • Kemudian kita flatMap () ini menjadi Stream menggunakan fungsi identitas

3. Menggunakan StreamEx

StreamEx adalah pustaka Java sumber terbuka yang memperluas kemungkinan Java 8 Stream. Ini menggunakan kelas StreamEx sebagai peningkatan ke antarmuka Stream JDK .

3.1. Menggabungkan Stream s

Pustaka StreamEx memungkinkan kita untuk menggabungkan aliran menggunakan metode instance append () :

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

Karena ini adalah metode instance, kita dapat dengan mudah merangkainya dan menambahkan beberapa aliran.

Perhatikan bahwa kami juga bisa membuat Daftar keluar dari sungai dengan menggunakan ToList () jika kita ketik resultingStream variabel ke StreamEx jenis.

3.2. Menggabungkan Aliran Menggunakan prepend ()

StreamEx juga berisi metode yang menambahkan elemen sebelum satu sama lain disebut prepend () :

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

4. Menggunakan Jooλ

jOOλ adalah pustaka yang kompatibel dengan JDK 8 yang menyediakan ekstensi berguna untuk JDK. Abstraksi aliran terpenting di sini disebut Seq . Perhatikan bahwa ini adalah aliran berurutan dan teratur, jadi memanggil parallel () tidak akan berpengaruh.

4.1. Menggabungkan Arus

Sama seperti pustaka StreamEx, jOOλ memiliki metode append () :

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

Juga, ada kenyamanan ToList () metode jika kita ketik resultingSeq variabel ke jOOλ Seq jenis.

4.2. Menggabungkan Aliran Dengan prepend ()

Seperti yang diharapkan, karena ada metode append () , ada juga metode prepend () di jOOλ:

@Test public void given3Streams_whenPrepending_thenResultStreamContainsAllElements() { Stream seq = Stream.of("foo", "bar"); Stream openingBracketSeq = Stream.of("["); Stream closingBracketSeq = Stream.of("]"); Stream resultingStream = Seq.ofType(seq, String.class) .append(closingBracketSeq) .prepend(openingBracketSeq); Assert.assertEquals( Arrays.asList("[", "foo", "bar", "]"), resultingStream.collect(Collectors.toList())); } 

5. Kesimpulan

Kami melihat bahwa penggabungan aliran relatif mudah menggunakan JDK 8. Ketika kami perlu melakukan banyak penggabungan, mungkin akan bermanfaat untuk menggunakan perpustakaan StreamEx atau jOOλ agar mudah dibaca.

Anda dapat menemukan kode sumbernya di GitHub.