这里的一个回答引用了所有CompletableFuture方法的表格,但不完全是我要找的,或者说我可能在错误的方向上寻找。
我正在寻找CompletableFuture中与Streams的peek()相当的方法,基本上是返回输入参数的
除了编写自己的实用函数外,是否有一种优雅的方法在中间阶段执行操作,而无需返回任何内容,同时保持阶段的当前类型?
我正在寻找CompletableFuture中与Streams的peek()相当的方法,基本上是返回输入参数的
thenApply
,或者是不返回Void
的thenRun
。我可以想到两种方式,两种方式都不太准确地表达了我的意图,但却能实现目标:(..)
.thenApply((a) -> {
doSomething();
return a;
}
(..)
并且
(..)
.whenComplete((result, exception) -> {
if (exception == null) {
doSomething();
}
}
(..)
这两种方法都使用前一阶段的输入,让我执行一个操作,并返回相同类型的内容到下一阶段。其中后一种方法限制了我的时序,只有在所有其他操作完成之后才能进行,而不是异步地在前一个必要阶段完成后立即进行。
我也一直在寻找一个将消费函数作为参数的身份函数,但好像我必须自己编写它:
public static <T> Function<T, T> identityConsumer(Consumer<T> c) {
return a -> { c.accept(a); return a; };
}
(..)
.thenApply(identityConsumer(a -> doSomething()));
(..)
除了编写自己的实用函数外,是否有一种优雅的方法在中间阶段执行操作,而无需返回任何内容,同时保持阶段的当前类型?
thenApply()
在异常情况下不会被调用)。whenComplete()
似乎正是你要找的。 - Didier Lpeek()
的方法,你也应该处理异常,因为它们不会停止后续阶段的执行 - 与Stream
API 相反,在其中任何异常都会停止整个管道。无论如何,目前我们所拥有的解决方案都在这里提到了。 - Didier L