当前位置: 首页 > 知识库问答 >
问题:

关于Java8中的功能接口,什么是“功能形状”?

汝繁
2023-03-14

在Java8中,新的包是Java。util。函数包含很多函数接口。该软件包的文档(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)多次提到“函数形状”:

  • 有几种基本函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从T到R的零元函数)
  • 函数形状根据其最常用的方式有一个自然的算术。基本形状可以通过arity前缀进行修改,以指示不同的arity,例如双函数(从T和U到R的二进制函数)
  • 还有扩展基本函数形状的其他派生函数形状,包括一元运算符(扩展函数)和二元运算符(扩展双函数)

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

有人能提供“函数形状”的定义并发明一个例子吗?它是计算机科学中的一个通用术语,还是只与Java8有关?函数形状如何与函数描述符(如(T)-

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

共有2个答案

阎懿轩
2023-03-14

我没有找到任何关于“函数形状”一词的官方或广泛接受的定义的参考,所以下面是我自己的解释。

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

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

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

在函数式编程语言中,“类型签名”通常包括返回类型。签名有助于理解函数的功能,因此它们通常被明确地写下来。例如,新的BiFunction的签名(或Java术语中的“函数形状”)可以写为(T,U)-

以下是新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 

  

何承
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 关于Java8 内置 功能接口,我遇到了许多问题,包括this,this和this。但是所有人都问“为什么只有一种方法?” 或“如果使用功能接口执行X,为什么会出现编译错误”等。我的问题是: 当我仍然可以在自己的接口中使用lambda时,这些新功能接口的存在目的 是 什么 ? 考虑一下oracle文档中的以下示例代码: 好的,很好,但这可以通过上面自己的示例来实现(带有单个方法的接口已

  • 还是这些标准的功能接口(消费者、供应商、谓词、函数)是用来充当代码组织、可读性、结构、[其他]的模板?

  • 更准确地说,函数接口定义为具有一个抽象方法的任何接口。 然后他继续介绍示例,其中一个是接口: 我能够测试是否可以使用lambda函数代替比较器参数,并且它能够工作(例如)。

  • 我正在学习这个函数接口科目,我研究如何使用预定义的函数接口:谓词和函数。 所以我创建了几个实现: 这与简单地调用一个常规函数来完成这些任务有何不同? 是为了让lambdas使用它们吗?是否允许将它们作为方法参数传递? 我真的错过了这个技术的真正道理。

  • 问题内容: 在此页面中,我找到了新的JavaScript函数类型: 我已经知道了什么,以及做的,但不知道什么是注定的。它是什么? 问题答案: 这是一个生成器功能。 生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。调用迭代器的方法时,将执行生成器函数的主体,直到第一个表达式指定要从迭代器返回的值,或者使