Mục lục
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 và 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