为什么Future.onSuccess需要部分功能

我试图使用Future从一个光滑的动作返回一些基本功能,我打了一些非常琐碎的绊脚石。

andThenonSuccess方法都需要将PartialFunction作为参数传递。 我的理解可能是相当有缺陷的,但阅读匿名函数后,好像andThen需要知道你与满足任何匿名函数SuccessFailure的输入。

鉴于onSuccess已经只能满足Success案例,为什么它仍然需要成为PartialFunction

这段代码我指出了我遇到的问题:

val db = Database.forConfig("h2mem1")

try {
  val f = db.run(setupCommands)
    .onSuccess { println(_) }

  Await.ready(f, 10.seconds )
}
finally db.close

我收到一个编译错误:

[error]  found   : Unit => Unit
[error]  required: PartialFunction[Unit,?]
[error]         .onSuccess { println(_) }

他们这样做,这样你就可以模式匹配的结果,虽然我同意这似乎不必要的,我真的不使用onSuccess ,喜欢mapflatMap我的未来:

  val f = Future.successful("test")

  f.onSuccess({
    case "test" => println("Worked")
    case x: String => println(s"Kind of worked: $x")
  })

在更高级的数据类型的情况下,我可以看到这更有用:

  val fOpt = Future.successful(Option("Test"))

  fOpt.onSuccess({
    case Some(x) => println(x)
    case None => println("None")
  })

真的,这可能只是来自演员api,因为当你ask一个演员你不知道返回类型,你需要模式匹配,因为它是Any

  val actor:ActorRef = ???

  val fAny = actor ? "asking"

  fAny.onSuccess({
    case x:String => println(s"Something String $x")
    case x:Int => println(s"Something Int $x")
    case x => println(s"Something else $x")
  })

那么,你可以通过一个PartialFunction ,如果它需要一个:

db.run(setupCommands).onSuccess(PartialFunction(println))

要么:

db.run(setupCommands).onSuccess { case result => println(result) }
链接地址: http://www.djcxy.com/p/86433.html

上一篇: Why does Future.onSuccess require a partial function

下一篇: Spring Data REST does not seem to be working with elasticsearch