5

在 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 到布尔的一元函数)和 Supplier(从 R 的一元函数)。
  • 函数形状具有基于它们最常用的方式的自然属性。基本形状可以通过一个元数前缀来修改,以指示不同的元数,例如 BiFunction(从 T 和 U 到 R 的二元函数)。
  • 还有其他派生函数形状可以扩展基本函数形状,包括 UnaryOperator(扩展函数)和 BinaryOperator(扩展 BiFunction)。

我以前从未听说过“函数形状”这个术语,除了上面的文档之外,我几乎无法在任何地方找到对它的引用,但由于那是 Oracle 关于函数接口的正式文档,我想了解它。

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

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

4

2 回答 2

2

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

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

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

于 2014-10-11T06:33:43.543 回答
2

我没有找到对“功能形状”一词的官方或广泛接受的定义的任何参考,因此以下是我自己的解释。

“函数形状”似乎是它的“类型签名” ,包括返回类型,即总和描述:

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

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

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

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

以下是新 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 
于 2014-10-11T06:56:23.063 回答