Lambda “a”是什么;函数形状“;关于Java8中的功能接口?
在Java8中,新的包Java.util.function包含许多函数接口。该包()的文档多次引用了“函数形状”: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) 还有其他派生的函数形状,它们扩展了基本的函数形状,包括一元运算符(扩展函数)和二元运算符(
- 有几种基本的函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从N到R的零元函数)
- 函数形状根据其最常用的方式具有自然的算术性。基本形状可以通过一个arity前缀来修改,以指示不同的arity,例如双函数(来自 T和U到R)
- 还有其他派生的函数形状,它们扩展了基本的函数形状,包括一元运算符(扩展函数)和二元运算符(扩展双函数)
下面来自Brian Goetz的两条评论回答了我在本文中提出的问题 就类型参数而言,函数形状基本上就是其输入和输出的样子:
- 一元函数接受一个输入并返回一个输出[T→R]
- 二进制函数接受两个输入并返回一个输出[(T,U)→R]
- 三元函数接受三个输入并返回一个输出[(T,U,V)→R]
- 供应商(也称为空函数)不接受输入并返回一个输出[()→R]
- 消费者只接受一个输入,不返回任何输出[t→()]
- 一元谓词接受一个输入并返回一个布尔类型[T]的输出→bool]
- 二进制谓词接受两个输入并返回一个布尔类型[(T,U)的输出→bool]
- 一元运算符接受一个输入并返回一个相同类型的输出[T]→T]
- 二进制运算符接受两个相同类型的输入,并返回一个相同类型的输出[(T,T)→T]
还有许多其他形状,但这些都是常见的。我没有找到任何关于“函数形状”的官方或广泛接受的定义,因此下面是我自己的解释 “函数形状”似乎是其形状,即对以下各项的总和描述:
- 其参数类型的有序列表/元组,以及
- 它的返回类型
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] 是一种特定的“功能形状”,双功能功能接口就是一个具体的例子