6

这个顺序看起来很奇怪,因为在常规 Java 中总是首先指定返回类型。如:

public static double sum(Iterable<Number> nums) { ... }

那么,为什么在 Function 和 BiFunction 类中选择以相反的方式指定它们呢?如:

interface Function<T,R>
interface BiFunction<T,U,R>

我不是在这里询问哪个更好的意见,但具体来说:

a) 选择一个订单而不是另一个订单是否有任何技术或其他(非风格)好处?还是随意的选择?

b) 是否有人知道权威来源的任何书面解释或任何陈述的原因,为什么选择一个而不是另一个?

顺便说一句:如果扩展到更高的位数,这个顺序似乎更加奇怪。例如,假设的 QuadFunction:

interface QuadFunction<A,B,C,D,R> { ... }

(在撰写本文时,库中的最高元数是 2 - 即 BiFunction。)

见:http: //download.java.net/jdk8/docs/api/java/util/function/package-summary.html

4

5 回答 5

13

它应与先前存在的符号一致。

数学整数除法函数扩展到有理数:

(\): I x I -> Q

上述的函数式编程版本(如 Haskell、Ocaml)

division :: Integer -> (Integer -> Rational)

or

division :: Integer -> Integer -> Rational

这三个都说“除法函数接受两个整数并返回一个有理数”。在功能范式中,先说你的回报是倒退的。C 教会我们说“我们在除法函数中返回一个有理数,它接受两个整数”(例如浮点除法(int a,int b){})。

在 Java 中,您的返回类型位于方法的左侧,因为 Java 想要看起来像 C。C 的设计者认为“int main(int argv, char *argv[])”看起来比“main(int argv, char * argv[]) 整数”。在编写代码时,至少对我而言,我常常在知道一个方法需要什么之前就知道它会返回什么。(编辑 1:我们写像 String s=removeSpaces(textLine) 这样的行,所以左边的返回值与左边的变量匹配)

在 C# 中,func看起来与 Java 8 Function 相同。

于 2013-11-01T13:14:05.180 回答
6

我的猜测是方法链接更直观,这可能是 lambdas 的典型用例,即

IntStream.range(1, 10).map(Ints::random).filter(x -> x % 2 == 0)

因此,这里的方法序列从左到右读取,而 lambda 从左到右读取。那么为什么不让类型参数从左到右呢?

进一步升级 - 原因可能是英语从左到右阅读。:-)

更新

我很惊讶地发现这是数学现代阿拉伯符号发生的事情:

拉丁复数

拉丁复数

阿拉伯复数

阿拉伯复数

在此示例中,每个 char 中的阿拉伯符号都反映了拉丁语。可以通过角度符号和i(图像单位)字符来跟踪这一点 - 在这两种情况下它都有一个点。在链接的 wiki 文章中,还有一个反向lim箭头的示例(与 Java 8 lamda 的箭头方向相比)。这可能意味着,如果曾经开发过阿拉伯语 Java,它的外观会有所不同。:-)

免责声明:我有数学背景,但在回答这个问题时我不知道阿拉伯符号。

于 2013-11-01T13:17:36.840 回答
4

它的明确意图是让 Java 中的函数式编程更方便。现在,在数学中,函数通常写成

f: A -> B

(即,从 As 到 Bs 的函数)。这也对应于函数式语言、Scala 和已经存在的 Java 函数库中的符号。

换句话说:这是正确的事情。

请注意,函数式接口不是方法,方法也不是函数式接口,因此不清楚前者的语法与后者有什么关系。

于 2013-11-01T13:08:18.657 回答
4

在普通的过程和面向对象编程中,函数/方法通常采用参数列表并返回一些结果:

int max(int num1, int num2)

当将函数签名重写为基于回调的(例如用于并行或异步处理)时,通过将返回回调附加为最后一个参数来转换签名是一种长期的做法:

void maxAsync(int num1, int num2, Callback<int> callback) // pseudo-Java

在GWT RPC 处理中可以找到这种模式的当前示例。

这种风格起源于 Lisp 语言风格,即所谓的continuation-passing style ,其中函数通过将函数作为参数传递给函数来链接。由于在 Lisp 中参数是从左到右计算的,因此使用值的函数需要位于列表的末尾。这种安排已被命令式语言采用以保持连续性,并且因为传统上在参数列表的末尾附加额外的可选参数(布尔标志等)。

于 2013-11-01T13:05:17.547 回答
0

只是我的看法:看起来和Function番石榴一样。我猜相反的顺序会引起很多混乱。

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html

于 2013-11-01T13:01:00.867 回答