JDK是否提供虚拟消费者?

Boh*_*ian 24 java consumer java-8 java-stream

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

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

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

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

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

注意:此代码完全简化了实际代码,仅用于说明目的.实际上,限制将不起作用,因为存在围绕什么/如何消耗元素的逻辑.可以把它想象成从流中消费"header"元素,然后让消费者使用"body"元素.

这个问题是关于"无所事事"的lambda t -> {}.

在JDK中的某个地方是否有"无所事事"的消费者,比如"无所事事"功能Function.identity()

Tag*_*eev 19

不,JDK不提供虚拟消费者以及其他预定义函数,例如虚拟可运行,始终为真的谓词或供应商,它们总是返回零.只是写t -> {}一下,它总是比调用任何可能的就绪方法更短.

  • @Bohemian:没有人阻止你定义一个`static final Consumer <Object> DO_NOTHING = x - > {};`常量并在整个应用程序中使用它.但更大的问题是为什么你认为你需要那个.[如上所述](http://stackoverflow.com/questions/35306760/does-the-jdk-provide-a-dummy-consumer#comment58324055_35306760),这是一个很大的代码味道,很可能有一个更清洁的解决方案没有无操作"消费者". (5认同)
  • 现在*你*我相信(创建了StreamEx).我问不是因为它更短,更快等,但因为使用一个名为"no nothing"的方法,例如"identity()",声明意图(绝对不是"做某事"实现的空占位符) (4认同)
  • 不幸的是(实现)简单的 lambda 并不像看起来那样独立于上下文;在这个 [case](http://stackoverflow.com/questions/34820066) 中,`Function.identity()` 比 `i-&gt;i` 好 (2认同)
  • @Bohemian:这根本没有任何意义.`forEach`是一个终端操作,它使整个流不可用.你不能用这种方式"抛弃溪流".换句话说,如果你想跳过元素,使用`Stream.skip`,没有别的.对于`forEach(NO_OP)`,仍然没有有效的用例 (2认同)

Boh*_*ian 6

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

由于 aFunction也是 a Consumer,因此您可以用作Function.identity()“不执行任何操作”的消费者。

然而,编译器需要一些帮助才能实现这一飞跃:

someStream.forEach(identity()::apply);
Run Code Online (Sandbox Code Playgroud)


Ser*_*nov 5

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

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

因此,JDK中不存在虚拟(空)消费者。