什么是Java 8中功能接口的“功能形状”?

时间:2014-10-11 06:30:35

标签: lambda java-8 functional-interface

在Java 8中,新包 java.util.function 包含许多功能接口。该软件包的文档(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)对"函数形状进行了多次引用":

  • 有几个基本的函数形状,包括Function(从T到R的一元函数),Consumer(从T到void的一元函数),Predicate(从T到boolean的一元函数)和Supplier (对R的nilary功能)。
  • 功能形状具有基于最常用方式的自然形态。基本的形状可以通过arity前缀进行修改,以指示不同的arity,例如BiFunction(二进制函数来自 T和U到R)。
  • 还有其他派生的函数形状,它们扩展了基本的函数形状,包括UnaryOperator(扩展函数)和BinaryOperator(扩展BiFunction)。

我从未听说过术语"功能形状"以前,除了上面的文档之外,我几乎找不到对它的引用,但由于这是Oracle关于功能接口的正式文档,我想了解它。

任何人都可以提供"函数形状"的定义,并发明一个例子吗?它是计算机科学中的通用术语,还是仅与Java 8相关?函数形状如何与函数描述符相关(例如,谓词< T>接口的(T) - > boolean )?

更新 Brian Goetz的以下两条评论回答了我在这篇文章中提出的问题。

2 个答案:

答案 0 :(得分:2)

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

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

还有许多其他形状,但这些形状很常见。

答案 1 :(得分:2)

我没有找到任何关于术语和功能形状的官方或广泛接受的定义的参考,所以接下来是我自己的解释。

A"功能形状"似乎是"type signature" including the return type,即:&/ p>的总和描述

  • 其参数类型的有序列表/元组,以及
  • 其返回类型

(也就是说,除了函数名,参数名和正文之外,基本上都是关于函数的所有内容。)我怀疑他们没有使用术语"签名"因为它在Java中已经有了不同的含义 - 它不包含返回类型。所以他们发明了一个新名词。

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

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

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

BiFunction<T,U,R>,            (T, U) -> R
BinaryOperator<T,U,R>         (T, U) -> R
BiPredicate<T,U>              (T, U) -> boolean
Consumer<T>                   T      -> ()            note: `()` means `void`
Function<T,R>                 T      -> R
IntFunction<R>                int    -> R
Predicate<T>                  T      -> boolean
Supplier<R>                   ()     -> R
UnaryOperator<T,R>            T      -> R