Giới thiệu Spliterator trong Java

Spliterator interface được giới thiệu trong Java 8, được sử dụng để duyệt và phân vùng trình tự các luồng dữ liệu. Nó là một interface cung cấp các tiện ích cơ bản cho Stream API, đặc biệt là các hoạt động song song trên Stream.

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách sử dụng, các đặc điểm, method và cách triển khai một Spliterator cho riêng mình.

Spliterator API

tryAdvande 

Đây là method chính được sử dụng mỗi khi duyệt qua một phần tử trong dãy nối tiếp. tryAdvande() method nhận 1 Consumer làm tham số đầu vào, nó được sử dụng xử lý các phần tử của Spliterator và trả về false nếu không còn phần tử nào tồn tại.

Ví dụ sử dụng tryAdvande() để duyệt các phần tử trong Stream.

public class Test {
    public static void main(String[] agrs) {
        Map<String, Integer> ages = new HashMap<>();
        ages.put("John", 25);
        ages.put("Freddy", 24);
        ages.put("Samuel", 30);


        List<Integer> values = Arrays.asList(3, 5, 8, 9, 12);
        Spliterator<Integer> spliterator = values.stream().spliterator();
        while (spliterator.tryAdvance(e -> System.out.print(e +" ")));

    }

}

Output: 3 5 8 9 12 

Note: tryAdvande() được sử dụng để xử lý các phần tử tuần tự cho đến phần tử cuối cùng.

trySplit

Tiếp theo, trySplit sẽ xử lý và chia các phần tử thành nhiều phân vùng độc lập. Nó sẽ cố gắng chia các phần tử thành 2 phần riêng biệt, cho phép thực thi riêng lẽ trên các luồng song song.

Ví dụ tạo 1 Stream chứa các số Integer, generate một Stream với 3500 phần tử. Chúng ta có thể lấy Spliterator của Stream thông qua spliterator() method.

class test {
    public static void main(String[] agrs) {
        Spliterator<Integer> split1 = generateElements().spliterator();
        Spliterator<Integer> split2 = split1.trySplit();

        System.out.println(split1.estimateSize());
        System.out.println(split2.estimateSize());


    }

    public static List<Integer> generateElements() {
        Random random = new Random();
        return Stream.generate(() -> random.nextInt(3500))
                .limit(35000)
                .collect(Collectors.toList());
    }
    
}

Output:

17500
17500

estimatedSize

Method estimatedSize trả về số phần tử của Spliterator 

System.out.println(split1.estimateSize()); // 17500

Spliterator Characteristics

Chúng ta có 8 thuộc tính đặc trưng trong Spliterator class: ORDERED, DISTINCT, SORTED, SIZE, NONNULL, IMMUTABLE, CONCURRENT SUBSIZE. Chúng sẽ được quản lý bởi các đối tượng tạo ra chúng, và sẽ được trả về khi gọi characteristics() method.

Ví dụ Spliterator cho Collection sẽ trả về SIZE, Spliterator cho Set trả về DISTINCT và Spliterator cho SortedSet trả về SORTED.

Support for Primitive Values

Spliterator API cũng hỗ trợ cho các kiểu dữ liệu nguyên thuỷ double, int và long:

  • OfPrimitive<T, T_CONS, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>>: Interface cha của Spliterator cho kiểu dữ liệu nguyên thuỷ.
  • OfInt: Spliterator cho int
  • OfDouble: Spliterator cho double
  • OfLong: Spliterator cho long

Tóm lược

Trong bài viết này, chúng ta đã tìm hiểu về Spliterator trong Java và cách sử dụng của nó. Các đặc trưng cơ bản và và trình xử lý, phân vùng dữ liệu của Spliterator.

Nguồn tham khảo

https://howtodoinjava.com/java/collections/java-spliterator/

https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html

https://www.baeldung.com/java-spliterator#spliterator-api

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