js go python 实现闭包貌似很简单
我想说 Java 的「闭包」很蛋疼... 被闭包引用的「域外」变量只能是 final
的,而且可读性很差,引用 guava的一个例子,自己比较下:
「二比青年版」:
Multiset<Integer> lengths = HashMultiset.create(
FluentIterable.from(strings)
.filter(new Predicate<String>() {
public boolean apply(String string) {
return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
}
})
.transform(new Function<String, Integer>() {
public Integer apply(String string) {
return string.length();
}
}));
这里 Predicate
和 Function
匿名类就是「闭包」,分别实现了 Predicate
接口和 Function
接口。看看这一坨代码... Java 中慎用这种「编码模式」!
「普通青年版」:
Multiset<Integer> 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 表达式,估计会好一些。
C语言实现闭包函数,可以参考《C语言接口与实现》一书,作者多次使用闭包,不过作者说的闭包应该指的是回调函数。和Java估计不大相同。比如下面的这个函数Table_map,其中的回调函数apply,可以在C中称为一个闭包。注:以上是作者的书中,中译本的说法~
void Table_map(T table,
void apply(const void *key, void **value, void *cl),
void *cl) {
int i;
unsigned stamp;
struct binding *p;
assert(table);
assert(apply);
stamp = table->timestamp;
for (i = 0; i < table->size; i++)
for (p = table->buckets[i]; p; p = p->link) {
apply(p->key, &p->value, cl);
assert(table->timestamp == stamp);
}
}
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.8k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
4 回答1.9k 阅读
c语言不熟悉,java中的闭包是通过“接口+内部类”实现的
以下是网上的一个例子
可以参考下这个博客http://www.cnblogs.com/chenjunbiao/archive/2011/01/26/1944417.html