如何交错Java8流?类似于收集器。joining()但用于字符串以外的对象
在Java8中,我如何做这样的事情如何交错Java8流?类似于收集器。joining()但用于字符串以外的对象,java,java-8,java-stream,Java,Java 8,Java Stream,在Java8中,我如何做这样的事情 public String join(Stream<String> strings, String string) { return strings.collect(Collectors.joining(string)); } 公共字符串联接(流字符串、字符串字符串){ 返回strings.collect(收集器.连接(字符串)); } 但是对于Runnable而不是字符串 public void join(Stream<Runn
public String join(Stream<String> strings, String string) {
return strings.collect(Collectors.joining(string));
}
公共字符串联接(流字符串、字符串字符串){
返回strings.collect(收集器.连接(字符串));
}
但是对于Runnable而不是字符串
public void join(Stream<Runnable> runnables, Runnable runnable) {
}
公共void连接(流可运行,可运行){
}
换句话说,我想在
runnables
流中的每个元素之后调用runnable
,最后一个元素除外 首先使用flatMap
在流中的每个元素之前插入交错runnable,然后使用skip
从流中删除第一个元素。然后按顺序运行它们
runnables
.reduce((r1, r2) -> () -> {
r1.run();
runnable.run();
r2.run();
})
.orElse(() -> {})
.run();
public void join(Stream<Runnable> runnables, Runnable runnable) {
runnables
.flatMap(r -> Stream.of(runnable, r))
.skip(1)
.forEachOrdered(Runnable::run);
}
公共void连接(流可运行,可运行){
可运行
.flatMap(r->Stream.of(runnable,r))
.skip(1)
.forEachOrdered(可运行::运行);
}
它们并不完全平行。您想组合它们还是按顺序调用它们?按顺序调用,如runnables[0]
,然后runnable
,然后runnables[1]
,然后再runnable
。runnable
的run()
方法没有返回值,因此如何“加入”结果?这是误用流的一个很好的例子。@Andreas我将其解释为请求从stream.of(r1,r2,r3,r4…
到r1.run();runnable.run();r2.run();runnable.run()。。。;runnable.run();rn.run()代码>@LouisWasserman这也是我的解释,但我的观点是为什么runnables一开始是流形式的。如果它们必须以这样的顺序交错运行,那么这一切都与可运行程序的副作用有关(因为它们不返回任何内容),而这一切都违背了流的目的。可运行项很可能是从数组或集合开始的,为什么不循环它呢?为什么要强制使用流?本质上,我是在声明这是一个XY问题。@shmosel,我考虑过这个问题,但我很确定它会引入额外的调用runnable
,例如,作为第一个调用,在流中的任何runnable运行之前。所以不,我认为这是错误的。(一般来说,reduce(foo,combiner)
确实需要foo
作为操作的标识。)@shmosel,我认为这也不能解决问题?这种技术在交织后不会产生流
。所以我认为身份重载和forEachOrdered都不会有帮助。这难道不要求Runnable本身是关联的吗?这似乎不太可能,因为它们可能有副作用。@StuartMarks,我不认为有什么问题?组合操作是关联的,只是缺少标识。最后得到的嵌套Runnable的实际结构将根据执行策略而有所不同-它看起来像一棵树,其结构与流进行组合的方式相匹配-但运行Runnable基本上会对树进行无序遍历,这将永远是一样的。@shmosel我的回答确实使用了forEachOrdered
。这是你想的吗?