Chuyển đổi và xử lýDataStream trong Guava

Trong phát triển phần mềm hiện đại, xử lý và chuyển đổi dữ liệu là một yêu cầu phổ biến. Từ việc đọc dữ liệu từ file, nhận đầu vào từ người dùng, đến truy vấn dữ liệu từ cơ sở dữ liệu, dữ liệu thường cần trải qua một loạt các bước xử lý và chuyển đổi. Guava cung cấp các công cụ và lớp rất hữu ích để đơn giản hóa quy trình này, đặc biệt là nhờ phong cách gọi链式 (chain-style) giúp mã nguồn trở nên rõ ràng và thanh lịch hơn.

1. Lớp FluentIterable: Xử lý dữ liệu một cách linh hoạt

FluentIterable là một phiên bản được cải thiện của Iterable trong Guava. Nó cho phép các thao tác chuỗi (chain-style) trên các tập dữ liệu, làm cho mã nguồn dễ đọc và dễ bảo trì hơn.


FluentIterable<String> danhSachTen = FluentIterable.from(Lists.newArrayList("Hoa", "Thu", "An", "Nam"))
    .filter(ten -> ten.startsWith("T"))
    .transform(String::toUpperCase);

Trong ví dụ trên, chúng ta đã:

  • Lọc các tên không bắt đầu bằng chữ "T"
  • Chuyển đổi các tên còn lại sang chữ hoa

Phong cách gọi链式 này giúp tránh việc khai báo các biến tạm thời không cần thiết.

2. Sử dụng lớp Iterables để xử lý dữ liệu

Iterables là một lớp công cụ mạnh mẽ trong Guava, giúp xử lý các tập dữ liệu Iterable một cách hiệu quả. Các phương thức như transform, filter, v.v... được cung cấp để thực hiện các thao tác cần thiết.


Iterable<String> danhSachTen = Lists.newArrayList("Hoa", "Thu", "An", "Nam");
Iterable<String> tenInUpperCase = Iterables.transform(danhSachTen, String::toUpperCase);
for (String ten : tenInUpperCase) {
    System.out.println(ten);
}

Ví dụ này cho thấy cách chuyển đổi tất cả các phần tử trong tập dữ liệu sang chữ hoa một cách dễ dàng.

3. Lớp Joiner: Kết hợp các chuỗi một cách dễ dàng

Joiner là một công cụ hữu ích để kết hợp các phần tử trong một tập hợp thành một chuỗi duy nhất. Nó cũng cho phép bỏ qua các giá trị null hoặc thay thế chúng bằng một chuỗi mặc định.


List<String> ten = Lists.newArrayList("Hoa", "Thu", null, "An", "Nam");
String ketQua = Joiner.on(", ").skipNulls().join(ten);
System.out.println(ketQua);

Output:

Hoa, Thu, An, Nam

Hoặc thay thế null bằng một chuỗi mặc định:


String ketQuaMacDinh = Joiner.on(", ").useForNull("Ẩn danh").join(ten);
System.out.println(ketQuaMacDinh);

Output:

Hoa, Thu, Ẩn danh, An, Nam

4. Lớp Splitter: Tách các chuỗi một cách linh hoạt

Splitter là một công cụ mạnh mẽ để tách các chuỗi dựa trên các phân cách hoặc biểu thức chính quy. Nó cũng cho phép bỏ qua các khoảng trắng không mong muốn.


String nhap = "táo,quýt;cam,chanh";
Iterable<String> hoaQua = Splitter.onPattern("[,;]").split(nhap);
for (String fruit : hoaQua) {
    System.out.println(fruit);
}

Output:

táo quýt cam chanh

Ví dụ khác:


String nhapCoKhoangTrang = "táo, quýt, cam";
Iterable<String> hoaQuaNoKhoangTrang = Splitter.on(",")
    .trimResults()
    .split(nhapCoKhoangTrang);
for (String fruit : hoaQuaNoKhoangTrang) {
    System.out.println(fruit);
}

Output:

táo quýt cam

5. Thao tác链式 và xử lý dữ liệu phức tạp

Trong các trường hợp thực tế, dữ liệu thường phải trải qua nhiều bước xử lý. Guava cho phép kết hợp các thao tác một cách dễ dàng:


String nhap = "táo,,quýt,,,cam,null,";
List<String> ketQua = Splitter.on(",")
    .omitEmptyStrings()
    .splitToList(nhap)
    .stream()
    .map(String::toUpperCase)
    .filter(item -> !item.equals("NULL"))
    .collect(Collectors.toList());
System.out.println(ketQua);

Output:

[TÁO, QUÝT, CAM]

Ví dụ này minh họa cách kết hợp các thao tác như tách, lọc và chuyển đổi dữ liệu.

6. Kết luận

Guava cung cấp các công cụ mạnh mẽ để xử lý và chuyển đổi dữ liệu một cách rõ ràng và hiệu quả. Từ các thao tác链式 với FluentIterable, đến việc kết hợp và tách các chuỗi với Joiner và Splitter, Guava giúp giảm thiểu các thao tác rườm rà và làm tăng tính dễ đọc của mã nguồn.

Thẻ: Guava FluentIterable Iterables Joiner Splitter

Đăng vào ngày 9 tháng 6 lúc 05:03