Chủ Nhật, 9 tháng 6, 2024

Stream

 

Trong Java, Streams là một phần của gói java.util.stream, được giới thiệu từ Java 8 để hỗ trợ thao tác và xử lý dữ liệu theo phong cách hàm. Streams cung cấp một cách tiếp cận mạnh mẽ và hiệu quả để làm việc với các tập hợp dữ liệu (collections) như danh sách (list), tập hợp (set), hoặc mảng (array).

Các khái niệm cơ bản về Stream

  1. Stream là gì?

    • Stream là một chuỗi các phần tử được tính toán theo yêu cầu (lazy).
    • Streams không lưu trữ dữ liệu, chúng chỉ cung cấp các hoạt động để thao tác trên dữ liệu.
    • Streams không thay đổi dữ liệu nguồn, chúng chỉ tạo ra kết quả mới dựa trên dữ liệu nguồn.
  2. Các loại Stream:

    • Sequential Streams: Xử lý các phần tử tuần tự một cách đơn lẻ.
    • Parallel Streams: Xử lý các phần tử đồng thời, tận dụng nhiều CPU core để cải thiện hiệu suất.

Các thao tác trên Stream

Streams hỗ trợ hai loại thao tác chính:

  1. Intermediate Operations: Các thao tác trung gian chuyển đổi Stream từ dạng này sang dạng khác. Các thao tác này là lazy (chỉ được thực hiện khi có thao tác cuối cùng - terminal operation).

    • filter(Predicate predicate): Lọc các phần tử dựa trên một điều kiện.
    • map(Function mapper): Chuyển đổi các phần tử sang dạng khác.
    • flatMap(Function mapper): Chuyển đổi các phần tử thành Stream khác và ghép các Stream này thành một Stream.
    • distinct(): Loại bỏ các phần tử trùng lặp.
    • sorted(): Sắp xếp các phần tử.
    • limit(long maxSize): Giới hạn số lượng phần tử.
  2. Terminal Operations: Các thao tác cuối cùng, sau khi thực hiện các thao tác này, Stream sẽ không còn sử dụng được nữa.

    • forEach(Consumer action): Thực hiện một hành động cho mỗi phần tử.
    • collect(Collector collector): Thu thập các phần tử thành một tập hợp hoặc cấu trúc dữ liệu khác.
    • reduce(BinaryOperator accumulator): Kết hợp các phần tử thành một giá trị duy nhất.
    • count(): Đếm số phần tử.
    • anyMatch(Predicate predicate), allMatch(Predicate predicate), noneMatch(Predicate predicate): Kiểm tra các phần tử dựa trên một điều kiện.

Ví dụ sử dụng Stream trong Java

Dưới đây là một ví dụ đơn giản về cách sử dụng Stream để lọc và chuyển đổi một danh sách các số nguyên:

import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); // Output: [2, 4, 6, 8, 10] } }

Trong ví dụ trên, chúng ta sử dụng Stream để lọc các số chẵn từ danh sách numbers và thu thập kết quả vào một danh sách mới evenNumbers.

Streams trong Java giúp code trở nên ngắn gọn, dễ đọc và dễ bảo trì hơn khi làm việc với các tập hợp dữ liệu lớn. Chúng cũng giúp tận dụng tối đa hiệu suất của hệ thống thông qua khả năng xử lý song song (parallel processing).

Không có nhận xét nào:

Đăng nhận xét