如何在不使用终止语句的情况下终止Java流?
我一直在玩streams,然后我注意到,当我执行以下操作时,它不会向控制台生成输出:如何在不使用终止语句的情况下终止Java流?,java,java-stream,Java,Java Stream,我一直在玩streams,然后我注意到,当我执行以下操作时,它不会向控制台生成输出: String[]is={“你好”、“世界”、“我的”、“名字”、“is”、“Jacky”}; Arrays.stream(is).peek(s->System.out.println(s)); 我想这是因为peek()是一种非终止流方法,应该使用forEach()而不是peek()来终止流并产生结果: Arrays.stream.forEach->System.out.println(s)); 然而,是否有
String[]is={“你好”、“世界”、“我的”、“名字”、“is”、“Jacky”};
Arrays.stream(is).peek(s->System.out.println(s));
我想这是因为peek()
是一种非终止流方法,应该使用forEach()
而不是peek()
来终止流并产生结果:
Arrays.stream.forEach->System.out.println(s));
然而,是否有一种方法可以“提前”终止流,使用一种自定义终止方法(功能接口),除了终止流之外,它不会做任何事情?。。有没有一种合适的方法来处理Java中已经存在的内容
我知道我可以这样做:
Arrays.stream(is).peek(s->System.out.println(s)).forEach(s->{});
但这感觉很浪费。没有这样的事情 例如,关于这类功能已经有过讨论,您可以从中了解到这不会发生以及原因 您最好的选择是
forEach(x->{})
,或者您可以自己创建这样一个虚拟消费者,并在任何需要的地方使用它:
static class Dummies {
static <T> Consumer<T> getConsumer() {
return x -> {};
}
}
静态类假人{
静态使用者getConsumer(){
返回x->{};
}
}
@DanielZ。我猜OP的问题是是否有一个no OP终止语句。我对Java1.8以外的知识非常有限。至少对于Java1.8来说,答案似乎是“否”:没有sink()
/consume()
/terminate()
操作。写一个显然是琐碎的(正如OP所示);但是什么才是“最不浪费的”方式(forEach(s->{})
实际上似乎是一个很好的候选人)?@KonradRudolph没有这样的事情。对OP更糟糕的是,理论上,forEach(s->{})
可以被编译器完全忽略(它毕竟什么都不做),因此任何其他中间操作也可以,有效地使这个流成为一个不可操作的流,您不需要从流开始…您不能在forEach
之后使用collect
。原则上,如果使用可证明忽略其输入的函数调用forEach
,即使该函数确实执行了某些操作,也可以允许实现不使用流的元素,例如x->System.out.println(“Hello”)
。理论上,这可以通过使用null
输入调用函数.count()。相反,潜在的优化会导致在使用可识别的no-op消费者时不处理元素。对于OP的实际问题,一般的答案应该是不要试图在中间操作中施加副作用。