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.