您何时以及为何使用 Java 的供应商和消费者接口?

新手上路,请多包涵

作为一名学习 Java 的非 Java 程序员,我正在阅读 SupplierConsumer 接口。而且我无法理解它们的用法和含义。

您何时以及为何使用这些接口?有人可以给我一个简单的外行例子吗?

我发现 Doc 示例不够简洁,不足以让我理解。

原文由 james emanon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
2 个回答

这是供应商:

 public Integer getInteger() {
    return new Random().nextInt();
}

这是消费者:

 public void sum(Integer a, Integer b) {
    System.out.println(a + b);
}

因此,通俗地说,供应商是一种返回某些值(如其返回值)的方法。然而,消费者是一种消耗某些值(如方法参数)并对其执行某些操作的方法。

那些将转变为这样的东西:

 // new operator itself is a supplier, of the reference to the newly created object
Supplier<List<String>> listSupplier = ArrayList::new;
Consumer<String> printConsumer = a1 -> System.out.println(a1);
BiConsumer<Integer, Integer> sumConsumer = (a1, a2) -> System.out.println(a1 + a2);

至于用法,最基本的例子是: Stream#forEach(Consumer) 方法。它需要一个 Consumer,它从您正在迭代的流中消费元素,并对它们中的每一个执行一些操作。可能打印它们。

 Consumer<String> stringConsumer = (s) -> System.out.println(s.length());
Arrays.asList("ab", "abc", "a", "abcd").stream().forEach(stringConsumer);

原文由 Rohit Jain 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题