gpt4 book ai didi

c# - 闭包和 java 匿名内部类

转载 作者:行者123 更新时间:2023-11-29 05:57:18 26 4
gpt4 key购买 nike

有没有人愿意为像这样的闭包(使用 C# 获得)和匿名内部类发布等效的 Java 代码?

    public static Func<int, int> IncrementByN()
{
int n = 0; // n is local to the method

Func<int, int> increment = delegate(int x)
{
n++;
return x + n;
};

return increment;
}
static void Main(string[] args)
{

var v = IncrementByN();
Console.WriteLine(v(5)); // output 6
Console.WriteLine(v(6)); // output 8
}

此外,如果词法闭包可用,谁能解释如何获得部分应用,反之亦然?对于第二个问题,C# 将不胜感激,但这是您的选择。非常感谢。

最佳答案

Java 中还没有闭包。 Lambda 表达式即将出现在 Java 8 中。但是,您尝试翻译的唯一问题是它具有状态,我认为这不是 Lambda 表达式支持的东西。请记住,它实际上只是一种简写,以便您可以轻松实现单一方法接口(interface)。但是我相信你仍然可以模拟这个:

final AtomicInteger n = new AtomicInteger(0);
IncrementByN v = (int x) -> x + n.incrementAndGet();
System.out.println(v.increment(5));
System.out.println(v.increment(6));

不过我还没有测试过这段代码,它只是作为一个例子,说明在 Java 8 中可能会发生什么。

想想集合 api。假设他们有这个界面:

public interface CollectionMapper<S,T> {
public T map(S source);
}

还有一个关于 java.util.Collection 的方法:

public interface Collection<K> {
public <T> Collection<T> map(CollectionMapper<K,T> mapper);
}

现在,让我们看看没有闭包的情况:

Collection<Long> mapped = coll.map(new CollectionMapper<Foo,Long>() {
public Long map(Foo foo) {
return foo.getLong();
}
}

为什么不这样写:

Collection<Long> mapped = ...;
for (Foo foo : coll) {
mapped.add(foo.getLong());
}

更简洁吧?

现在介绍 lambda:

Collection<Long> mapped = coll.map( (Foo foo) -> foo.getLong() );

看看语法有多好?你也可以链接它(我们假设有一个接口(interface)来进行过滤,它返回 boolean 值以确定是否过滤掉一个值):

 Collection<Long> mappedAndFiltered =
coll.map( (Foo foo) -> foo.getLong() )
.filter( (Long val) -> val.longValue() < 1000L );

关于c# - 闭包和 java 匿名内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com