正如彼得Lawrey評論的告誡,這是幾乎可以肯定將是作爲嵌套循環簡單。更結束了,Guava documentation給出了這樣的警告:
勢在必行代碼應該是你默認情況下,您的第一選擇如Java 7.除非你有絕對的把握下列之一的,則不應使用功能成語:
- 使用功能性成語會爲您的整個項目節省代碼行 的淨節省。將函數的定義 移動到另一個文件或常量中並沒有幫助。
- 爲了提高效率,您需要對轉換後的 集合進行延遲計算,並且無法解決顯式計算的集合問題。 此外,您已閱讀並重讀有效的Java,項目55和 除了遵循這些說明之外,您實際上已經完成 基準測試以證明此版本更快,並且可以引用 數字來證明它。
請務必使用番石榴的功能 實用程序時,該做事的傳統方式勢在必行不 更具可讀性。嘗試寫出來。那麼糟糕?難道那個 比可怕的功能性方法更具可讀性嗎?您是 即將嘗試?
不過,如果你對無視勸告堅持,你可以使用類似這樣的怪物(注意:我還沒有真正試圖編譯或運行此):
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;
}
});
}
});
}
});
現在問自己:你想維護哪個?哪一個會是最高效的?
番石榴的功能性成語有一些有效的用例。替換Java for循環,甚至嵌套for循環,都不是其中之一。
你可以嵌套你的映射。恕我直言,它可能是更簡單的嵌套循環,至少外層循環。 –
在第3行中,不應該是「continent.getCountries()」嗎? – Chris
您可以使用番石榴「變換」和「concat」來創建三元組的單個列表,然後對其進行迭代,但至少對於Java 7來說,代碼將會非常難看。我會留下嵌套的循環。 –
Chris