查看Scala Future的副作用结果

时间:2019-08-21 17:38:31

标签: scala future side-effects

我有一个返回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
  }
}

我需要手动返回输入。

1 个答案:

答案 0 :(得分:3)

Future.andThenhttps://www.scala-lang.org/api/current/scala/concurrent/Future.html#andThen就是为此目的。

对于您的代码,类似:

future.andThen(checkResult).onComplete(processResult)

此表达式返回andThen操作之前原始Future结果的新Future。传入andThen的操作仅是副作用,其结果将被丢弃。您还可以将几个andThen串联在一起,以产生多种副作用。