Kết hợp các Stream trong Java

Trong bài viết này chúng ta sẽ cùng nhau tìm cách kết hợp các stream data khác nhau lại thành một. Bạn sẽ cần kết hợp các stream lại với nhau khi bạn tách logic xử lý dữ liệu ra nhiều stream khác nhau đó kết hợp chúng lại để có được kết quả cuối cùng. Hay đầu vào của bạn là nhiều stream data khác nhau thì các bạn cần kết hợp chúng lại để xử lý theo một logic duy nhất.

Merge hai Stream 

Để làm được điều này thì Stream cũng đã cung cấp concat() method giúp kết hợp 2 stream data lại thành một.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream1 = Stream.of(1, 3, 5);
        Stream<Integer> stream2 = Stream.of(2, 4, 6);

        Stream<Integer> resultingStream = Stream.concat(stream1, stream2);
        resultingStream.forEach(item -> System.out.print(item + " "));
    }

}

Output: 1 3 5 2 4 6 

Merge nhiều Stream

Việc kết hợp 2 stream lại với nhau là một nhu cầu cơ bản, tuy nhiên đối diện với vấn đề phức tạp hơn là kết hợp nhiều hơn 2 stream lại với nhau. Cách đơn giản nhất là chúng ta có thể sử dụng concat() method lồng nhiều cấp với nhau.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream1 = Stream.of(1, 3, 5);
        Stream<Integer> stream2 = Stream.of(2, 4, 6);
        Stream<Integer> stream3 = Stream.of(18, 15, 36);

        Stream<Integer> resultingStream = Stream.concat(
                Stream.concat(stream1, stream2), stream3);

        resultingStream.forEach(item -> System.out.print(item + " "));
    }

}

Output: 1 3 5 2 4 6 18 15 36 

Cách trên mình chỉ làm cho vui thôi nhé, vì nếu có thêm nhiều stream nữa thì mã code sẽ trở nên rất khó hiểu và dài dòng. Chúng ta có một cách khác hay hơn là sử dụng Stream#flatMap để kết hợp chúng trong một vài đoạn code đơn giản

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream1 = Stream.of(1, 3, 5);
        Stream<Integer> stream2 = Stream.of(2, 4, 6);
        Stream<Integer> stream3 = Stream.of(18, 15, 36);
        Stream<Integer> stream4 = Stream.of(99);

        Stream<Integer> resultingStream = Stream.of(
                stream1, stream2, stream3, stream4)
                .flatMap(i -> i);


        resultingStream.forEach(item -> System.out.print(item + " "));
    }

}

Output  1 3 5 2 4 6 18 15 36 99 

StreamEx

StreamEx là một thư viện Java mã nguồn mở, tăng khả năng mở rộng của Java 8 Streams. Với rất nhiều method tiện dụng mà chúng ta có thể sử dụng để thao tác với stream dễ dàng hơn.

Để sử dụng StreamEX thì chúng ta cần phải thêm dependency của nó vào file POM.XML 

<dependency>
  <groupId>one.util</groupId>
  <artifactId>streamex</artifactId>
  <version>0.7.3</version>
</dependency>
import one.util.streamex.StreamEx;

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream1 = Stream.of(1, 3, 5);
        Stream<Integer> stream2 = Stream.of(2, 4, 6);
        Stream<Integer> stream3 = Stream.of(18, 15, 36);
        Stream<Integer> stream4 = Stream.of(99);

        Stream<Integer> resultingStream = StreamEx.of(stream1)
                .append(stream2)
                .append(stream3)
                .append(stream4);

        resultingStream.forEach(item -> System.out.printf(item + " "));
    }
}

Output: 1 3 5 2 4 6 18 15 36 99 

Ngoài ra, nó còn cung cấp prepend() method cho phép thêm các phần tử của một stream vào đầu stream giữ kết quả cuối cùng.

import one.util.streamex.StreamEx;

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<String> stream1 = Stream.of("foo", "bar");
        Stream<String> openingBracketStream = Stream.of("[");
        Stream<String> closingBracketStream = Stream.of("]");

        Stream<String> resultingStream = StreamEx.of(stream1)
                .append(closingBracketStream)
                .prepend(openingBracketStream);

        resultingStream.forEach(item -> System.out.printf(item + " "));
    }
}

Output: [ foo bar ] 

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x