Như Peter Lawrey nhận xét, đây là gần như chắc chắn sẽ được đơn giản như vòng lồng nhau. Hơn nữa, các Guava documentation cho cảnh báo này:
mã bắt buộc nên mặc định của bạn, lựa chọn đầu tiên của bạn như Java 7. Bạn không nên sử dụng thành ngữ chức năng trừ khi bạn hoàn toàn chắc chắn về một trong các cách sau:
- Sử dụng các thành ngữ chức năng sẽ dẫn đến tiết kiệm ròng các dòng mã cho toàn bộ dự án của bạn. Di chuyển định nghĩa của một hàm sang một tệp khác hoặc một hằng số, không giúp ích gì.
- Để đạt hiệu quả, bạn cần có chế độ xem được tính toán một cách lười biếng của bộ sưu tập được chuyển đổi và không thể giải quyết cho bộ sưu tập được tính toán rõ ràng. Ngoài ra, bạn đã đọc và đọc lại Java hiệu quả, mục 55 và ngoài việc làm theo các hướng dẫn đó, bạn đã thực sự thực hiện điểm chuẩn để chứng minh rằng phiên bản này nhanh hơn và có thể trích dẫn số để chứng minh điều đó.
Hãy chắc chắn, khi sử dụng các tiện ích của Guava, cách truyền thống bắt buộc để làm mọi thứ không phải là dễ đọc hơn. Hãy thử viết nó ra. Điều đó thật tệ? Có phải đó là nhiều hơn có thể đọc được hơn phương pháp tiếp cận chức năng lúng túng khó xử mà bạn đã chuẩn bị thử không?
Tuy nhiên, nếu bạn đang van lơn trên phớt lờ lời khuyên, bạn có thể sử dụng một cái gì đó giống như con quái vật này (lưu ý tôi đã không thực sự cố gắng để biên dịch hoặc chạy này):
FluentIterable.from(continentList)
.transform(new Function<Continent, Void>() {
public Void apply(Continent continent) {
return FluentIterable.from(continent.getCountries())
.transform(new Function<Country, Void>() {
public Void apply(Country country) {
return FluentIterable.from(country.getCities())
.transform(new Function<City, Void>() {
public Void apply(City city) {
// do stuff with city object
return null;
}
});
}
});
}
});
Bây giờ hãy tự hỏi: Bạn muốn duy trì cái nào? Mà sẽ là hiệu quả nhất?
Có các trường hợp sử dụng hợp lệ cho thành ngữ chức năng của Guava. Thay thế Java cho vòng lặp, thậm chí lồng nhau cho vòng lặp, không phải là một trong số họ.
Bạn có thể lồng bản đồ của mình. IMHO nó có thể đơn giản hơn như vòng lặp lồng nhau, cho các vòng ngoài ít nhất. –
Trong dòng 3, không nên là "continent.getCountries()"? – Chris
Bạn có thể sử dụng ổi "biến đổi" và "concat" để tạo một danh sách duy nhất triples và sau đó lặp lại điều đó, nhưng với Java 7 ít nhất, mã sẽ khá xấu xí. Tôi sẽ ở lại với các vòng lặp lồng nhau. –
Chris