Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不使用终止语句的情况下终止Java流?_Java_Java Stream - Fatal编程技术网

如何在不使用终止语句的情况下终止Java流?

如何在不使用终止语句的情况下终止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)); 然而,是否有

我一直在玩streams,然后我注意到,当我执行以下操作时,它不会向控制台生成输出:

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的实际问题,一般的答案应该是不要试图在中间操作中施加副作用。