Xử lý và chuyển đổi luồng dữ liệu với Guava trong Spring

Trong các ứng dụng hiện đại, việc xử lý luồng dữ liệu — từ file, người dùng hay cơ sở dữ liệu — thường đòi hỏi nhiều bước biến đổi. Thư viện Guava cung cấp các công cụ giúp đơn giản hóa quá trình này, đặc biệt với phong cách gọi chuỗi (chainable) giúp mã nguồn rõ ràng và dễ bảo trì hơn.

1. Xử lý dữ liệu theo chuỗi với FluentIterable

FluentIterable là phiên bản nâng cao của Iterable, cho phép thực hiện các thao tác lọc, biến đổi trên tập hợp một cách liền mạch:

var filteredNames = FluentIterable.from(Arrays.asList("Alice", "Bob", "Anna", "Brian"))
    .filter(name -> name.startsWith("A"))
    .transform(name -> name.toLowerCase());

Đoạn mã trên thực hiện hai bước: lọc tên bắt đầu bằng "A", sau đó chuyển tất cả về chữ thường — mà không cần khai báo biến trung gian.

2. Biến đổi tập hợp với Iterables

Lớp Iterables hỗ trợ xử lý các đối tượng Iterable thông qua các phương thức tiện ích như transform:

Iterable<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Iterable<String> strNumbers = Iterables.transform(numbers, n -> "Num_" + n);

for (String s : strNumbers) {
    System.out.println(s);
}

Kết quả in ra: Num_1, Num_2, ... — minh họa cách ánh xạ từng phần tử sang định dạng mới.

3. Ghép chuỗi linh hoạt với Joiner

Joiner giúp nối các phần tử thành chuỗi, đồng thời xử lý giá trị null một cách thông minh:

List<String> items = Arrays.asList("red", "green", null, "blue");
String joined = Joiner.on(" | ").skipNulls().join(items);
// Kết quả: "red | green | blue"

Hoặc thay thế null bằng giá trị mặc định:

String withDefault = Joiner.on(" - ").useForNull("N/A").join(items);
// Kết quả: "red - green - N/A - blue"

4. Phân tách chuỗi mạnh mẽ với Splitter

Splitter vượt trội hơn String.split() nhờ hỗ trợ loại bỏ khoảng trắng, bỏ qua chuỗi rỗng và dùng biểu thức chính quy:

String mixed = "dog; cat , bird ;; fish";
Iterable<String> animals = Splitter.onPattern("[;,]")
    .omitEmptyStrings()
    .trimResults()
    .split(mixed);

for (String animal : animals) {
    System.out.println(animal);
}

Kết quả: dog, cat, bird, fish — đã loại bỏ khoảng trắng và phần tử rỗng.

5. Kết hợp nhiều thao tác xử lý luồng

Có thể kết hợp Splitter với Stream API để thực hiện chuỗi xử lý phức tạp:

String rawData = "alpha,,beta,,,gamma,null,";
List<String> processed = Splitter.on(",")
    .omitEmptyStrings()
    .splitToList(rawData)
    .stream()
    .map(String::trim)
    .map(String::toUpperCase)
    .filter(s -> !s.equals("NULL"))
    .toList();

Kết quả cuối cùng: [ALPHA, BETA, GAMMA] — minh họa cách tích hợp Guava với Stream để xử lý dữ liệu đa bước.

Thẻ: Guava FluentIterable Joiner Splitter JavaStream

Đăng vào ngày 26 tháng 6 lúc 04:15