Java最接近.NET Func<>和Action<>委托的是什么?

8
显然,Java没有委托或函数作为一等值,并使用接口代替,但是Func<>或Action<> .NET委托最接近的接口是什么?有Runnable和Callable<>,但只有不带参数的版本。
由于Java不能具有具有相同名称和不同数量的泛型类型参数的重载类型,我理解不能有单个共享接口名称,但可以有Runnable1<>,Runnable2<>等。
这种编程风格在Java中是否不常用,还是我错过了任何现有接口?

2
在微软创建C#之前,他们有一个Java的实现(称为J++)。当他们试图向其中添加委托(以及枚举等其他内容)时,Sun公司起诉了他们,并表示他们不能再发布Java。这就是为什么他们创建了C#。如果您搜索有关Java委托的文章,您会发现许多人谴责将委托添加到Java,并建议使用实现接口的匿名内部类更好! - Gabe
请参见http://java.sun.com/docs/white/sidebar.html。 - Gabe
2
Java不能使用相同名称但泛型类型参数数量不同的重载类型:这是类型擦除作为泛型的错误方法的又一个原因... - Thomas Levesque
1
@Gabe,公正点,他们改变了许多其他东西,以便 MS Java 不会成为多平台。 - mP.
@Gabe - 非常有趣的链接,谢谢! - SoftMemes
请参见https://dev59.com/k3M_5IYBdhLWcg3w4nfb。 - anre
2个回答

0
我已经为你和我自己创建了一个jar文件 :)
maven信息:
<dependency>
    <groupId>com.incarcloud</groupId>
    <artifactId>ac-func-tion</artifactId>
    <version>1.1.0</version>
</dependency>

那么你可以像C#一样编写代码

import com.incarcloud.lang.*;

Action<Integer> actFoo = (x)->{ System.out.println(x); }
actFoo.run(1024);

Func2<Integer, Integer, Integer> actAdd = (x,y)->{ return x+y; }
int sum = actAdd.call(5,6);

更多信息可以在这里找到 https://github.com/InCar/ac-func-tion


0

我对.Net不是很熟悉,但从目前为止我所看到的来看,似乎您通常会为要存储的每种类型的函数/操作创建一个接口。虽然不完全相同,但听起来像是您要寻找的东西。

(接口不是匿名的,它有一个名称、一个含义和文档,这可能使代码更易于阅读。另一方面,编写它是额外的麻烦,您不能仅仅添加任何与签名匹配的函数)。

您是否有特定的用例需要推荐?很难做出概括性的陈述 ; )。


1
Action<> 被“重载”以处理没有返回值和零到 N 个参数(目前为 16),因此 Callable<T> 在这里毫无用处。实际上,在阅读了 Callable<T> 的描述后,我猜测 Java 的 Callable<T> 只能映射到 C# 的 Func<T> 上(它不带任何参数,返回 T),而且没有其他选择。 - paercebal
谢谢,因此接口在实践中可能经常被用作Action<T>的合理替代品,尽管从技术上讲它们非常不同。已更新答案以反映这一点。 - Arnout Engelen
Func<>和Action<>在使用高阶函数时非常有用。如果我想将列表中的所有项映射到另一个列表中,我可以给Select()提供一个Func<,>来完成。它甚至可以在.NET中成为一个命名委托类型,这将是最接近命名专门化接口的匹配 - 但匿名的美在于函数可以用于它们没有专门创建的事情... - SoftMemes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接