正如 Peter Lawrey 评论的那样,这几乎肯定会像嵌套循环一样简单。此外,Guava 文档给出了这个警告:
命令式代码应该是您的默认代码,从 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 循环,都不是其中之一。