Peter Lawrey がコメントしたように、これはネストされたループとしてより単純になることはほぼ確実です。さらに、グアバのドキュメントには次の警告が表示されます。
Java 7 以降では、命令型コードがデフォルトであり、最初の選択肢となるはずです。
- 機能的なイディオムを使用すると、プロジェクト全体のコード行を実質的に節約できます。関数の定義を別のファイルまたは定数に移動しても役に立ちません。
- 効率のために、変換されたコレクションの遅延計算されたビューが必要であり、明示的に計算されたコレクションに妥協することはできません。さらに、Effective Java の項目 55 を読んで再読し、これらの指示に従うだけでなく、このバージョンがより高速であることを証明するために実際にベンチマークを行い、それを証明する数値を引用することができます。
Guava の関数型ユーティリティを使用する場合は、従来の命令型の方法では読みやすくならないことに注意してください。書き出してみてください。そんなにひどかった?それは、あなたが試みようとしていた途方もなくぎこちない機能的アプローチよりも読みやすかったですか?
ただし、アドバイスを無視することに固執している場合は、この怪物のようなものを使用できます (実際にこれをコンパイルまたは実行しようとしていないことに注意してください)。
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;
}
});
}
});
}
});
ここで、次のことを自問してください。どちらを維持したいですか? どれが最も効率的でしょうか?
Guava の関数型イディオムには有効なユースケースがあります。Java の for ループを置き換えることは、ネストされた for ループであっても、その 1 つではありません。