我想说 Java 的「闭包」很蛋疼... 被闭包引用的「域外」变量只能是 final 的,而且可读性很差,引用 guava的一个例子,自己比较下:
「二比青年版」:
Multiset lengths = HashMultiset.create(
FluentIterable.from(strings)
.filter(new Predicate() {
public boolean apply(String string) {
return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
}
})
.transform(new Function() {
public Integer apply(String string) {
return string.length();
}
}));
这里 Predicate 和 Function 匿名类就是「闭包」,分别实现了 Predicate 接口和 Function 接口。看看这一坨代码... Java 中慎用这种「编码模式」!
「普通青年版」:
Multiset lengths = HashMultiset.create();
for (String string : strings) {
if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {
lengths.add(string.length());
}
}
短平快,可读性好!
「文艺青年版」:
(->> strings
(filter #(.matchesAllOf % CharMatcher/JAVA_UPPER_CASE))
(map #(.length %))
(HashMultiset/create))
当然,对于动态语言来说,太小菜了。
以后 Java 8 普及了,支持 Lambda 表达式,估计会好一些。