Luồng trong Java8

0
125

Stream là một lớp trừu tượng mới được giới thiệu trong Java 8. Sử dụng stream, bạn có thể xử lý dữ liệu theo cách khai báo tương tự như các câu lệnh SQL. Ví dụ, hãy xem xét câu lệnh SQL sau.

SELECT max(salary), employee_id, employee_name FROM Employee

Biểu thức SQL ở trên tự động trả về thông tin chi tiết của nhân viên được trả lương tối đa mà không cần thực hiện bất kỳ tính toán nào từ phía nhà phát triển. Sử dụng khung công tác tập hợp trong Java, một nhà phát triển phải sử dụng các vòng lặp và thực hiện kiểm tra nhiều lần. Một mối quan tâm khác là hiệu quả; vì các bộ xử lý đa lõi có sẵn một cách dễ dàng, một nhà phát triển Java phải viết xử lý mã song song có thể dễ xảy ra lỗi.

Để giải quyết những vấn đề như vậy, Java 8 đã giới thiệu khái niệm luồng cho phép nhà phát triển xử lý dữ liệu một cách khai báo và tận dụng kiến ​​trúc đa lõi mà không cần phải viết bất kỳ mã cụ thể nào cho nó.

Stream là gì?

Luồng đại diện cho một chuỗi các đối tượng từ một nguồn, hỗ trợ các hoạt động tổng hợp. Sau đây là các đặc điểm của Luồng:

  • Trình tự các phần tử – Một luồng cung cấp một tập hợp các phần tử của kiểu cụ thể theo cách tuần tự. Luồng nhận / tính toán các phần tử theo yêu cầu. Nó không bao giờ lưu trữ các phần tử.
  • Nguồn – Luồng lấy Bộ sưu tập, Mảng hoặc tài nguyên I / O làm nguồn đầu vào.
  • Hoạt động tổng hợp – Luồng hỗ trợ các hoạt động tổng hợp như bộ lọc, bản đồ, giới hạn, giảm, tìm, đối sánh, v.v.
  • Pipelining – Hầu hết các hoạt động stream đều trả về chính stream để kết quả của chúng có thể được pipelined. Các hoạt động này được gọi là các hoạt động trung gian và chức năng của chúng là lấy đầu vào, xử lý và trả đầu ra cho đích. Phương thức collect () là một hoạt động đầu cuối thường xuất hiện ở cuối hoạt động pipelining để đánh dấu sự kết thúc của luồng.
  • Lặp lại tự động – Các hoạt động truyền trực tuyến thực hiện lặp lại nội bộ qua các phần tử nguồn được cung cấp, ngược lại với Bộ sưu tập trong đó yêu cầu lặp lại rõ ràng.

Tạo luồng

Với Java 8, giao diện Bộ sưu tập có hai phương pháp để tạo Luồng.

  • stream () – Trả về một luồng tuần tự coi tập hợp là nguồn của nó.
  • llelStream () – Trả về một Luồng song song coi tập hợp là nguồn của nó.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

cho mỗi

Luồng đã cung cấp một phương thức mới ‘forEach’ để lặp lại từng phần tử của luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên bằng forEach.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

bản đồ

Phương pháp ‘bản đồ’ được sử dụng để ánh xạ từng phần tử với kết quả tương ứng của nó. Đoạn mã sau đây in các số ô vuông duy nhất bằng bản đồ.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

bộ lọc

Phương pháp ‘bộ lọc’ được sử dụng để loại bỏ các phần tử dựa trên tiêu chí. Đoạn mã sau in ra một số chuỗi trống bằng cách sử dụng bộ lọc.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

giới hạn

Phương pháp ‘giới hạn’ được sử dụng để giảm kích thước của luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên sử dụng giới hạn.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

sắp xếp

Phương thức ‘đã sắp xếp’ được sử dụng để sắp xếp luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên theo thứ tự đã sắp xếp.

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

Tiến trình song song

llelStream là sự thay thế của luồng để xử lý song song. Hãy xem đoạn mã sau in ra số lượng chuỗi trống bằng dòng song song.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Rất dễ dàng chuyển đổi giữa các luồng tuần tự và song song.

Người sưu tầm

Bộ thu thập được sử dụng để kết hợp kết quả xử lý trên các phần tử của một luồng. Bộ sưu tập có thể được sử dụng để trả về một danh sách hoặc một chuỗi.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);

Số liệu thống kê

Với Java 8, bộ thu thập thống kê được giới thiệu để tính toán tất cả các số liệu thống kê khi quá trình xử lý luồng đang được thực hiện.

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("Highest number in List : " + stats.getMax());
System.out.println("Lowest number in List : " + stats.getMin());
System.out.println("Sum of all numbers : " + stats.getSum());
System.out.println("Average of all numbers : " + stats.getAverage());

Ví dụ về luồng

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

Xác minh kết quả

Biên dịch lớp bằng trình biên dịch javac như sau:

C:\JAVA>javac Java8Tester.java
C:\JAVA>java Java8Tester

Khóa học Java Full stack (IJFD)

LEAVE A REPLY

Please enter your comment!
Please enter your name here