Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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
如何交错Java8流?类似于收集器。joining()但用于字符串以外的对象_Java_Java 8_Java Stream - Fatal编程技术网

如何交错Java8流?类似于收集器。joining()但用于字符串以外的对象

如何交错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

在Java8中,我如何做这样的事情

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
。这是你想的吗?