【发布时间】:2019-12-27 00:46:13
【问题描述】:
我有一个返回Future 的方法。我想根据它记录成功或失败,然后处理结果。在带有流的 Java 中,我会做类似的事情
getCollection().stream().
peek(e -> System.out.println("element: " + e).
forEach(e -> doStuff(e))
有没有类似的“窥视”未来的方法?我希望写一些类似的东西
getFuture().
peek(checkResult).
onComplete(processResult)
val checkResult: PartialFunction[Try[MyResult], Unit] = {
case Success(s) => println("Success on " + s)
case Failure(e) => e.printStackTrace()
}
但我能找到的最好的是
getFuture().
transform(checkResult).
onComplete(processResult)
def checkResult(r: [Try[MyResult]) = r match {
case Success(s) => {
println("Success on " + s)
r
}
case Failure(e) => {
e.printStackTrace()
r
}
}
我需要手动返回输入。
【问题讨论】:
-
你不能只是 .map(...) 吗?
-
@sinanspd 不,只有在
Future成功时才会调用。它仍然必须返回原始值。 -
好吧,从技术上讲,您可以将错误包装在 Either 中,但我认为链接中提供的隐式解决方案更好
-
@sinanspd 不,
map方法只有在Future成功时才会被调用,因此如果出现错误,您将无法获得 OP 想要的堆栈跟踪。
标签: scala future side-effects