JDK 是否提供虚拟消费者?

Does the JDK provide a dummy consumer?

我需要在代码块中使用流中的 'n' 项然后完成,本质上:

 public static <T> void eat(Stream<T> stream, int n) 
     // consume n items of the stream (and throw them away)
 }

在我的情况下,我无法将签名更改为 return Stream<T> 而只是 return stream.skip(n);我实际上必须从流中丢弃一些元素(不是简单的逻辑)- 为下游消费者做好准备,他们不需要知道这是如何发生的,甚至不需要知道发生了什么。

最简单的方法是使用limit(n),但我必须调用流终止方法来激活流,所以本质上我有:

public static <T> void skip(Stream<T> stream, int n) {
    stream.limit(n).forEach(t -> {});
}

注意:此代码是对实际代码的过度简化,仅供说明之用。实际上, limit 不会起作用,因为 what/how 周围有逻辑来消耗元素。可以把它想象成从流中消费 "header" 元素,然后让消费者消费 "body" 元素。

这个问题是关于 "do nothing" lambda t -> {}

在 JDK 的某处是否有 "do nothing" 消费者,例如 "do nothing" 函数 Function.identity()

不,JDK 不提供虚拟消费者以及其他预定义函数,例如虚拟可运行、始终为真的谓词或始终 returns 为零的供应商。只需编写 t -> {},它无论如何比调用任何可能的现成方法更短。

在工单范围内考虑引入虚拟(空)消费者:

根据ticket,决定不介绍了

因此,JDK 中没有虚拟(空)消费者。

是的。好吧,或多或少是...

由于 Function 也是 Consumer,您可以将 Function.identity() 用作“什么都不做”的消费者。

但是,编译器需要一些帮助才能实现飞跃:

someStream.forEach(identity()::apply);