Chuyển đến nội dung chính
Mô-đun 7 · Bài học 2 trong tổng số 214/14 trong khóa học~15 min
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:

  1. nguồn (ví dụ: list.stream())
  2. Không hoặc nhiều hoạt động trung gian (trả về Luồng mới, ví dụ: filter, map)
  3. 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.
Java
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ụng Collectors.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.
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

Hãy tự mình thử

tập thể dục#java.m7.l2.e1
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#java.m7.l2.e2
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#java.m7.l2.e3
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ử