您难以理解函数式接口(例如中的接口)的含义的原因java.util.function
就是这里定义的接口没有任何意义!他们的出现主要是为了代表结构, not 语义.
这对于大多数 Java API 来说是不典型的。典型的 Java API(例如类或接口)具有意义,您可以为其所代表的内容开发一个思维模型,并使用它来理解其上的操作。考虑java.util.List
例如。 AList
是其他对象的容器。它们有一个序列和一个索引。列表中包含的对象数量由以下命令返回size()
。每个对象的索引范围为 0..size-1(含)。索引处的对象i可以通过调用来检索list.get(i)
。等等。
中的功能接口java.util.function
没有任何这样的意义。相反,它们是仅仅代表结构函数的属性,例如参数的数量、返回值的数量以及(有时)参数或返回值是否是原语。因此我们有类似的东西Function<T,R>
它表示一个采用单个类型参数的函数T并返回一个类型的值R。就是这样。该功能有什么作用?好吧,它可以做任何事情......只要它接受单个参数并返回单个值。这就是为什么规范Function<T,R>
只不过是“表示一个接受一个参数并产生一个结果的函数”。
显然,当我们编写代码时,它是有意义的,而这种意义必须来自某个地方。就功能接口而言,其含义来自使用它们的上下文。界面Function<T,R>
孤立起来没有任何意义。然而,在java.util.Map<K,V>
API,有以下内容:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(为简洁起见,省略了通配符)
啊这个用Function
是作为“映射函数”。那有什么作用?在这种背景下,如果key
如果映射中尚不存在,则调用映射函数并将键传递给该函数,并期望生成一个值,并将生成的键值对插入到映射中。
所以你不能看规格Function
(或任何其他功能接口,就此而言)并尝试辨别它们的含义。您必须查看它们在其他 API 中的使用位置才能理解它们的含义,并且该含义仅适用于该上下文。