[Java 8] Chuyển đổi mảng thành Stream

Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách chuyển mảng thành Stream trong Java 8

Trong Java 8, có thể sử dụng Arrays.stream hoặc Stream.of để chuyển Array thành Stream

1. Mảng các đối tượng (Object Arrays)
Với mảng đối tượng, Arrays.stream và Stream.of đều trả về kết quả giống nhau

TestJava8.java
Java:
package com.mkyong.java8;

import java.util.Arrays;
import java.util.stream.Stream;

public class TestJava8 {

    public static void main(String[] args) {

        String[] array = {"a", "b", "c", "d", "e"};

        //Arrays.stream
        Stream<String> stream1 = Arrays.stream(array);
        stream1.forEach(x -> System.out.println(x));

        //Stream.of
        Stream<String> stream2 = Stream.of(array);
        stream2.forEach(x -> System.out.println(x));
    }

}
Kết quả
Code:
a
b
c
d
e
a
b
c
d
e
Mã nguồn JDK

Arrays.java
Java:
   /**
     * Returns a sequential {@link Stream} with the specified array as its
     * source.
     *
     * @param <T> The type of the array elements
     * @param array The array, assumed to be unmodified during use
     * @return a {@code Stream} for the array
     * @since 1.8
     */
    public static <T> Stream<T> stream(T[] array) {
        return stream(array, 0, array.length);
    }
Stream.java
Java:
   /**
     * Returns a sequential ordered stream whose elements are the specified values.
     *
     * @param <T> the type of stream elements
     * @param values the elements of the new stream
     * @return the new stream
     */
    @SafeVarargs
    @SuppressWarnings("varargs") // Creating a stream from an array is safe
    public static<T> Stream<T> of(T... values) {
        return Arrays.stream(values);
    }
*Ghi chú
Đối với mảng đối tượng, phương thức Stream.of sẽ gọi phương thức Arrays.stream

2. Mảng dữ liệu nguyên thủy (Primitive Arrays)
Với mảng của các kiểu dữ liệu nguyên thủy, Arrays.stream và Stream.of sẽ trả về kết quả khác nhau

TestJava8.java
Java:
package com.mkyong.java8;

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class TestJava8 {

    public static void main(String[] args) {

        int[] intArray = {1, 2, 3, 4, 5};

        // 1. Arrays.stream -> IntStream
        IntStream intStream1 = Arrays.stream(intArray);
        intStream1.forEach(x -> System.out.println(x));

        // 2. Stream.of -> Stream<int[]>
        Stream<int[]> temp = Stream.of(intArray);

        // Cant print Stream<int[]> directly, convert / flat it to IntStream
        IntStream intStream2 = temp.flatMapToInt(x -> Arrays.stream(x));
        intStream2.forEach(x -> System.out.println(x));

    }

}
Kết quả
Code:
1
2
3
4
5
1
2
3
4
5
Mã nguồn JDK

Arrays.java
Java:
   /**
     * Returns a sequential {@link IntStream} with the specified array as its
     * source.
     *
     * @param array the array, assumed to be unmodified during use
     * @return an {@code IntStream} for the array
     * @since 1.8
     */
    public static IntStream stream(int[] array) {
        return stream(array, 0, array.length);
    }
Stream.java
Code:
   /**
     * Returns a sequential {@code Stream} containing a single element.
     *
     * @param t the single element
     * @param <T> the type of stream elements
     * @return a singleton sequential stream
     */
    public static<T> Stream<T> of(T t) {
        return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
    }

Vậy khác nhau ở đâu?
Đối với mảng đối tượng, cả hai đều gọi cùng Arrays.stream (tham khảo ví dụ 1, mã nguồn JDK). Đối với các mảng nguyên thủy, mình thích Arrays.stream hơn, vì nó trả trực tiếp kích thước cố định IntStream, dễ dàng thao tác hơn.


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :)

Bài viết tham khảo tại: https://mkyong.com/java8/java-how-to-convert-array-to-stream
 

Bình luận