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 -> {}
,它无论如何比调用任何可能的现成方法更短。
在工单范围内考虑引入虚拟(空)消费者:
- [JDK-8182978] Add default empty consumer - Java Bug System.
- 存档:[JDK-8182978] Add default empty consumer - Java Bug System.
根据ticket,决定不介绍了
因此,JDK 中没有虚拟(空)消费者。
是的。好吧,或多或少是...
由于 Function
也是 Consumer
,您可以将 Function.identity()
用作“什么都不做”的消费者。
但是,编译器需要一些帮助才能实现飞跃:
someStream.forEach(identity()::apply);
我需要在代码块中使用流中的 '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 -> {}
,它无论如何比调用任何可能的现成方法更短。
在工单范围内考虑引入虚拟(空)消费者:
- [JDK-8182978] Add default empty consumer - Java Bug System.
- 存档:[JDK-8182978] Add default empty consumer - Java Bug System.
根据ticket,决定不介绍了
因此,JDK 中没有虚拟(空)消费者。
是的。好吧,或多或少是...
由于 Function
也是 Consumer
,您可以将 Function.identity()
用作“什么都不做”的消费者。
但是,编译器需要一些帮助才能实现飞跃:
someStream.forEach(identity()::apply);