JDK 是否提供虚拟使用者



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

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

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

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

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

注意:此代码是对实际代码的过度简化,仅用于说明目的。实际上,限制是行不通的,因为关于什么/如何使用元素是有逻辑的。把它想象成从流中使用"标头"元素,然后让使用者使用"body"元素。

这个问题是关于"什么都不做"的λ t -> {}

JDK 中的某个地方是否有"什么都不做"的消费者,比如"什么都不做"功能Function.identity()

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

引入虚拟(空(消费者在票证范围内被考虑:

  • [JDK-8182978] 添加默认的空使用者 - Java 错误系统。
  • 存档: [JDK-8182978] 添加默认的空使用者 - Java 错误系统。

根据票证,决定不介绍它。

因此,JDK 中没有虚拟(空(使用者。

是的。嗯,或多或少是的...

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

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

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

最新更新