JDK是否提供虚拟消费者?

时间:2016-02-10 04:18:42

标签: java java-8 java-stream consumer

我需要在一段代码中使用' 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 -> {});
}

注意:此代码完全简化了实际代码,仅用于说明目的。实际上,限制不会起作用,因为存在围绕什么/如何消耗元素的逻辑。把它想象成消费&#34;标题&#34;来自流的元素,然后让消费者消费&#34; body&#34;元件。

这个问题是关于&#34;什么都不做&#34; lambda t -> {}

是否有&#34;什么都不做&#34; JDK中的某个消费者,就像&#34;什么都不做&#34;函数Function.identity()

3 个答案:

答案 0 :(得分:16)

不,JDK不提供虚拟消费者以及其他预定义函数,例如虚拟runnable,always-true谓词或供应商,它们总是返回零。只需写t -> {},它总是比调用任何可能的就绪方法更短。

答案 1 :(得分:2)

在票的范围内考虑了引入虚拟(空)消费者:

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

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

答案 2 :(得分:0)

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

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

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

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