Lambda “a”是什么;函数形状“;关于Java8中的功能接口?

Lambda “a”是什么;函数形状“;关于Java8中的功能接口?,lambda,java-8,functional-interface,Lambda,Java 8,Functional Interface,在Java8中,新的包Java.util.function包含许多函数接口。该包()的文档多次引用了“函数形状”: 有几种基本的函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从N到R的零元函数) 函数形状根据其最常用的方式具有自然的算术性。基本形状可以通过一个arity前缀来修改,以指示不同的arity,例如双函数(来自 T和U到R) 还有其他派生的函数形状,它们扩展了基本的函数形状,包括一元运算符(扩展函数)和二元运算符(

在Java8中,新的包Java.util.function包含许多函数接口。该包()的文档多次引用了“函数形状”:

  • 有几种基本的函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从N到R的零元函数)
  • 函数形状根据其最常用的方式具有自然的算术性。基本形状可以通过一个arity前缀来修改,以指示不同的arity,例如双函数(来自 T和U到R)
  • 还有其他派生的函数形状,它们扩展了基本的函数形状,包括一元运算符(扩展函数)和二元运算符(扩展双函数)
我以前从未听说过“函数形状”这个词,除了上面的文档之外,我几乎找不到任何地方对它的引用,但由于这是Oracle关于函数接口的正式文档,我想了解它

有人能给出“函数形状”的定义并举例说明吗?它是计算机科学中的通用术语,还是仅与Java8有关?函数形状与函数描述符(例如谓词接口的(T)->布尔)有什么关系

更新
下面来自Brian Goetz的两条评论回答了我在本文中提出的问题

就类型参数而言,函数形状基本上就是其输入和输出的样子:

  • 一元函数接受一个输入并返回一个输出[T→R]
  • 二进制函数接受两个输入并返回一个输出[(T,U)→R]
  • 三元函数接受三个输入并返回一个输出[(T,U,V)→R]
  • 供应商(也称为空函数)不接受输入并返回一个输出[()→R]
  • 消费者只接受一个输入,不返回任何输出[t→()]
  • 一元谓词接受一个输入并返回一个布尔类型[T]的输出→bool]
  • 二进制谓词接受两个输入并返回一个布尔类型[(T,U)的输出→bool]
  • 一元运算符接受一个输入并返回一个相同类型的输出[T]→T]
  • 二进制运算符接受两个相同类型的输入,并返回一个相同类型的输出[(T,T)→T]

还有许多其他形状,但这些都是常见的。

我没有找到任何关于“函数形状”的官方或广泛接受的定义,因此下面是我自己的解释

“函数形状”似乎是其形状,即对以下各项的总和描述:

  • 其参数类型的有序列表/元组,以及
  • 它的返回类型
(也就是说,除了函数名、参数名和函数体之外,基本上所有关于函数的内容)我怀疑他们没有使用术语“签名”,因为它在Java中已经有了不同的含义——它不包括返回类型。于是他们发明了一个新名词

在函数式编程语言中,“类型签名”通常包括返回类型。签名有助于理解函数的功能,因此它们通常被明确地写下来。例如,新的
BiFunction
的签名(或Java术语中的“函数形状”)可以写为
(T,U)->R
,其中第一部分是表示参数列表的元组,第二部分是返回类型

因此,我不同意:我认为这些类型很重要,而且并没有被放弃。如果它们被放弃,那么在新名称空间中定义的几个类型将具有完全相同的函数形状(例如,
供应商
谓词
函数
)。如果是这样,那么为什么文档会选择用不匹配的函数形状概念来解释这些新类型呢?那没有道理。(答案已被编辑。)

以下是新Java函数接口的函数类型签名的几个示例:

双功能(T,U)->R
二进制运算符(T,U)->R
双预测(T,U)->布尔值
消费者T->()注意:`()`表示无效`
功能T->R
int函数int->R
谓词T->boolean
供应商()->R
一元运算符T->R

但如果是这种情况,那么函数和谓词将具有相同的形状:它们都接受一个输入并返回一个输出[1→1]. 然而,上面引用的文档明确描述了这些接口具有不同的形状。您可能说得对,但我不确定类型是否可以被忽略。@skomi是的,也许最好在讨论中加入类型。特别是因为,有一些通用的一元函数(
T->U
)、谓词(
T->bool
)和运算符(
T->T
),它们彼此都有不同的感觉。Lemme修改我的帖子。@stakx您的定义似乎与JSR335中定义的“函数描述符”相近:“函数接口I的函数描述符是一种方法类型参数、形式参数类型、返回类型和抛出类型,可用于合法重写I的抽象方法”。这很好,但提出了一个问题:“函数形状”和“函数描述器”有什么区别?@skomi我认为函数形状更抽象,而函数描述符有一个正式的具体定义(如JSR335所述)。啊,好的!使用上面的一个例子:[(T,U)→R] 是一种特定的“功能形状”,双功能功能接口就是一个具体的例子