Những điểm mới của Java 8 (phần 3: Streams API – tiếp)

Bài viết được sự cho phép của smartjob.vn
Streams API trong Java 8 là một bước tiến lớn của ngôn ngữ lập trình Java và liên quan đến nhiều khía cạnh khác nhau, nên chúng tôi cần kéo dài thêm chủ đề này. Nếu bạn là lập trình viên C# trên nền .NET framework vào năm 2008, có thể bạn từng háo hức tìm hiểu LINQ. Từ năm 2014 trở về sau, lập trình viên Java cũng được tận hưởng cảm giác tương tự với Java Streams API.
Tôi đã từng rất say mê C#, trong ký ức xưa cũ, tôi tìm tên những nhân viên có chứa từ “Văn” sử dụng cú pháp LINQ:
string[] employeeList = {"Nguyễn Văn Còn", "Phạm Văn Đoan", "Nguyễn Văn Minh", "Đoàn Minh Huệ"}; List filteredNames = employeeList.Where(c => c.Contains("Văn")).ToList();
Giờ đây với Java 8 Streams API:
string[] employeeList = {"Nguyễn Văn Còn", "Phạm Văn Đoan", "Nguyễn Văn Minh", "Đoàn Minh Huệ"}; List filteredNames = employeeList.Where(c => c.Contains("Văn")).ToList();
Sự linh hoạt, hữu dụng của Streams API thể hiện ở số lượng “pattern” rất đa dạng. “pattern” tạm hiểu là cách dùng, cách thức tổ hợp, phối hợp các phương thức để mang đến kết quả mong muốn. Phần nội dung này để trình bày thêm về các “pattern”.
Có nhiều cách để khởi tạo dòng nước (stream):
// Khởi tạo dòng (stream) từ mảng (array). Arrays.stream(stringArray); // Khởi tạo dòng số nguyên (stream of integer numbers) từ khoảng giá trị. IntStream.range(9, 42); // Khởi tạo dòng (stream) từ List<T> employeeList.stream(); // Khởi tạo dòng nước (stream) từ tập hợp các file. Files.walks(); // Khởi tạo dòng nước (stream) từ Spliterator<T> - Một interface mới trong bộ Collections. java.util.Spliterator() // Khởi tạo dòng (stream) từ tập hợp hữu hạn giá trị. Streams.of("Nguyễn Văn Còn", "Đoàn Minh Huệ", "Nguyễn Văn Cảnh", "Nguyễn Văn Hải"); // Sử dụng chức năng của Supplier (đã kết hợp với Java 8 Lamba expression). Supplier<Stream<String>> employeeList = () -> Stream.of("Nguyễn Văn Còn", "Đoàn Minh Huệ", "Nguyễn Văn Cảnh", "Nguyễn Văn Hải");
(Supplier là interface class mới xuất hiện từ Java 8. Xem javadoc: https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html).
Xem thêm các việc làm Java lương cao trên Station D
Tìm các nhân viên có tên bắt đầu bằng chữ “H”:
Stream.of("Hùng", "Trường", "Khánh", "Hằng", "Đoan") .map(s->s.toUpperCase()) .filter(s->s.startsWith("H")) .forEach(System.out::println); // Kết quả: //HÙNG //HẰNG
Ghi chú: Khi sử dụng cú pháp
System.out::println
chúng ta đã sử dụng đến kỹ thuật Method references (tham chiếu phương thức, mới có từ Java 8), thể hiện qua ký hiệu 2 dấu 2 chấm :: Xem thêm tài liệu từ Oracle: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html . Nếu không muốn dùng cú pháp “tham chiếu phương thức”, bạn có thể dùng cú pháp Lambda expression vẫn cho kết quả như cũ:
.forEach(s-> System.out.println(s));
Stream characteristics – Lọc dòng nước theo điều kiện
Trong phần trước, chúng ta đã sử dụng ví dụ đếm số lượng các ký tự phân biệt:
String foo = "smartjobdotvn"; IntStream letters = foo.chars(); long counter = letters.distinct().count(); // Nhưng chỉ có 11 ký tự sau khi loại bỏ trùng lặp. System.out.println("Số ký tự có mặt trong chuỗi (đã loại bỏ trùng lặp): " + counter);
Chúng ta đã “lọc dòng nước” theo điều kiện distinct() (phân biệt/khác biệt). Danh sách dài hơn các điều kiện lọc mà bạn có thể sử dụng trong Streams API là:
DISTINCT CONCURENT IMMUTABLE NONNULL ORDERED SIZED SORTED SUBSIZED
cũng chính là các field do class interface Spliterator cung cấp. Xem Javadocs: https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html Mục “Field Summary”.
Đỗ Như Vý – Bài viết gốc được đăng tải tại smartjob.vn
Có thể bạn quan tâm:
- Cùng tìm hiểu về Stream trong Java 8
- Java 9 và những điều cần biết
- Giới thiệu về Reactive Programing trong javascript
Xem thêm Việc làm IT hấp dẫn trên Station D
Bạn có thể quan tâm
- Hiểu về trình duyệt – How browsers work(Công Nghệ)
- Xây dựng hệ thống referral trong Laravel(Công Nghệ)
- Applicant Tracking System là gì? ATS hoạt động ra sao(Cẩm Nang Tuyển Dụng)