Bài học theo mô-đun (2/2)
API luồng
Stream API trong Java cho phép bạn xử lý các bộ sưu tập đối tượng theo cách khai báo, tận dụng lập trình chức năng. Luồng không lưu trữ dữ liệu mà thay vào đó mang các phần tử từ một nguồn (chẳng hạn như danh sách hoặc mảng) thông qua một hệ thống hoạt động.
Một đường ống Stream bao gồm ba phần:
- nguồn (ví dụ:
list.stream()) - Không hoặc nhiều hoạt động trung gian (trả về Luồng mới, ví dụ:
filter,map) - Hoạt động đầu cuối (tạo ra kết quả cuối cùng hoặc tác dụng phụ và đóng Luồng, ví dụ:
collect,forEach,reduce)
Hoạt động trung gian chung
Các hoạt động trung gian rất lười biếng: chúng không được thực thi cho đến khi một thao tác đầu cuối được gọi.
filter(Predicate): lọc các phần tử dựa trên điều kiện boolean.map(Function): biến đổi từng phần tử thành một đối tượng khác bằng cách áp dụng một hàm.sorted(): sắp xếp các phần tử của Stream.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"Hoạt động của thiết bị đầu cuối chung
forEach(Consumer): thực hiện một hành động cho từng thành phần của Luồng.collect(Collector): tập hợp các kết quả Luồng vào một vùng chứa (ví dụ: danh sách sử dụngCollectors.toList()).reduce(identity, BinaryOperator): kết hợp các phần tử Luồng thành một giá trị tích lũy duy nhất.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10Hãy tự mình thử
Hoàn tất mã bằng cách sử dụng dòng số để chỉ lọc các số chẵn, thu thập chúng vào Danh sách mới có tên là chẵn và in bằng System.out.println.
Hiển thị gợi ý
Bắt đầu bằng cách gọi `numbers.stream()`, nối thêm `.filter(n -> n % 2 == 0)` và cuối cùng thu thập bằng `.collect(Collector.toList())`.
Giải pháp khả dụng sau 3 lần thử
Sử dụng các luồng để chuyển đổi tất cả các tên trong danh sách tên thành chữ hoa bằng cách sử dụng bản đồ và in từng tên một bằng cách sử dụng forEach với tham chiếu phương thức.
Hiển thị gợi ý
Sử dụng `.map(s -> s.toUpperCase())` theo sau là thao tác đầu cuối `.forEach(System.out::println)`.
Giải pháp khả dụng sau 3 lần thử
Hoàn thành mã bằng cách tính tổng của tất cả các số trong danh sách số bằng cách sử dụng Luồng và thao tác đầu cuối rút gọn với giá trị ban đầu là 0. In tổng.
Hiển thị gợi ý
Sử dụng `numbers.stream().reduce(0, (a, b) -> a + b)` và in biến kết quả.
Giải pháp khả dụng sau 3 lần thử