如何交错Java 8 Stream?像Collectors.joining()一样,但是对于Strings以外的东西

Kev*_*dge 3 java java-8 java-stream

在Java 8中,我该如何做这样的事情......

public String join(Stream<String> strings, String string) {
    return strings.collect(Collectors.joining(string));
}
Run Code Online (Sandbox Code Playgroud)

但对于Runnables而不是Strings.

public void join(Stream<Runnable> runnables, Runnable runnable) {

}
Run Code Online (Sandbox Code Playgroud)

换句话说,我想runnablerunnables除了最后一个之外的流中的每个元素之后调用.

Lou*_*man 6

runnables
    .reduce((r1, r2) -> () -> { 
         r1.run(); 
         runnable.run();
         r2.run(); 
    })
    .orElse(() -> {})
    .run();
Run Code Online (Sandbox Code Playgroud)

  • 这不是要求runnables本身是关联的吗?这似乎不太可能,因为他们可能有副作用. (2认同)
  • @StuartMarks,我不认为有问题吗?组合操作*是*关联的,它只是缺乏一个身份.你最终得到的嵌套Runnable的实际结构将根据执行策略而有所不同 - 它看起来像一棵树,其结构与Stream的组合方式相匹配 - 但运行Runnable基本上会进行inorder遍历树,永远是一样的. (2认同)

4ca*_*tle 6

首先使用flatMap在流中的每个元素之前插入交错runnable,然后使用从流中删除第一个元素skip.然后按顺序运行所有这些.

public void join(Stream<Runnable> runnables, Runnable runnable) {
    runnables
        .flatMap(r -> Stream.of(runnable, r))
        .skip(1)
        .forEachOrdered(Runnable::run);
}
Run Code Online (Sandbox Code Playgroud)