一个操作的多个Java使用者

一个操作的多个Java使用者,java,function,lambda,java-8,consumer,Java,Function,Lambda,Java 8,Consumer,有没有一种方法可以让下面的动作实际上是一个动作中的两个动作 static int process(String[] cmd, File dir, Consumer<? super String> action) throws IOException { ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(dir); pb.redirectErrorStream(true); Stopwat

有没有一种方法可以让下面的动作实际上是一个动作中的两个动作

static int process(String[] cmd, File dir, Consumer<? super String> action) throws IOException {
    ProcessBuilder pb = new ProcessBuilder(cmd);
    pb.directory(dir);
    pb.redirectErrorStream(true);
    Stopwatch sw = Stopwatch.createStarted();
    Process p = pb.start();
    int exit = -1;
    try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
        br.lines().forEach(action);
    } finally {
        log.debug("Ending process {} with exist code {} in time {}", pb.command(),
                exit = p.destroyForcibly().exitValue(), sw);
    }
    return exit;
}

static int process(String[]cmd,File dir,Consumer很容易创建一个
Consumer
委托给其他Consumer。只需编写

 str -> {
   action1(str);
   action2(str);
   // etc
 }

由于您不必使用方法引用,因此始终可以使用lambda。以这种风格编写
消费者
也比尝试以其他方式组合它们更具可读性,尽管其他方式也是可能的。

这里有一些备选方案,其中一些已经被其他人提到

也许最类似lambda的方法是使用消费者自己的聚合方法
,然后
(在
消费者
本身中定义):

不看文档,我打赌:

  • 您需要实际调用最后的消费操作,如
    forEach
    (或
    count
    empty
    等),以便执行不同的查看
  • 执行顺序中的唯一限制是,只要i
我认为您可能希望使用
消费者。然后
基于您问题的内容,但是如果有一些操作的执行不是手头任务的中心/主要部分,而是一个理想的副作用,那么
peek
似乎是一个合理的解决方案

也许您希望传递一个修改后的流,该流将“监视”流引用传递到的代码稍后正在处理的对象。在这种情况下,
peek
是更好的选择,如果不是唯一的选择

当然,你也可以两者兼而有之

Stream<X> exes = ....
exes.forEach(action1
    .andThen(action2)
    .andThen(action3)
    .andThen(...)
    .andThen(actionN));
Stream<X> exes = ...
exes.peek(action1)
 .peek(action2)
 .peek(action3)
 .peek(...)
 .forEach(actionN);