作为一名学习 Java 的非 Java 程序员,我正在阅读 Supplier
和 Consumer
接口。而且我无法理解它们的用法和含义。
您何时以及为何使用这些接口?有人可以给我一个简单的外行例子吗?
我发现 Doc 示例不够简洁,不足以让我理解。
原文由 james emanon 发布,翻译遵循 CC BY-SA 4.0 许可协议
作为一名学习 Java 的非 Java 程序员,我正在阅读 Supplier
和 Consumer
接口。而且我无法理解它们的用法和含义。
您何时以及为何使用这些接口?有人可以给我一个简单的外行例子吗?
我发现 Doc 示例不够简洁,不足以让我理解。
原文由 james emanon 发布,翻译遵循 CC BY-SA 4.0 许可协议
您难以理解诸如 java.util.function
中的功能接口的含义的原因是此处定义的接口没有任何意义!它们的存在主要是为了表示 _结构_,而不是 _语义_。
这对于大多数 Java API 来说是不典型的。典型的 Java API(例如类或接口)是有意义的,您可以为它所代表的内容开发一个心智模型,并使用它来理解对它的操作。考虑 java.util.List
例如。 A List
是其他对象的容器。他们有一个序列和一个索引。列表中包含的对象数由 size()
返回。每个对象都有一个在 0..size-1(含)范围内的索引。可以通过调用 list.get(i)
检索索引 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 中的使用位置才能理解它们的含义,并且该含义仅适用于该上下文。
原文由 Stuart Marks 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
这是供应商:
这是消费者:
因此,通俗地说,供应商是一种返回某些值(如其返回值)的方法。然而,消费者是一种消耗某些值(如方法参数)并对其执行某些操作的方法。
那些将转变为这样的东西:
至于用法,最基本的例子是:
Stream#forEach(Consumer)
方法。它需要一个 Consumer,它从您正在迭代的流中消费元素,并对它们中的每一个执行一些操作。可能打印它们。