一个操作的多个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);