Future.onComplete:无法理解方法签名

时间:2015-01-13 10:31:15

标签: scala asynchronous future

  /** When this future is completed, either through an exception, or a value,
   *  apply the provided function.
   *
   *  If the future has already been completed,
   *  this will either be applied immediately or be scheduled asynchronously.
   *
   *  $multipleCallbacks
   *  $callbackInContext
   */
  def onComplete[U](func: Try[T] => U)(implicit executor: ExecutionContext): Unit

基本用法似乎是:

  result.onComplete({
    case Success(listInt) => {
      //Do something with my list
    }
    case Failure(exception) => {
      //Do something with my error
    }
  })

此函数在返回Unit时产生副作用似乎很有用(如记录完成) 我不明白的是该函数返回的此类型U是什么。我们提供的函数的返回类型是否真的有用? Scala如何使用它?

同样的问题适用于onSuccessonFailure

修改以更清楚地了解def onComplete[U](func: Try[T] => U)def onComplete(func: Try[T] => Unit)的好处是什么?


修改

Chirlo是对的,U型函数更灵活,我们可以更容易地传递不返回Unit的现有函数。

type T = String

def onComplete[U](func: Try[T] => U): Unit = { }
def onComplete2(func: Try[T] => Unit): Unit = { }

// Existing function that does not return Unit
def log[T]( t : Try[T]): Int = 0

onComplete(log) // This compiles fine
onComplete2(log) // This does not compile

2 个答案:

答案 0 :(得分:1)

它使功能更灵活。如果它会返回Unit,您可以只传递函数Try[T] => Unit,但是通过返回U,您可以将任何以Try[T]作为参数的函数传递给您,可能已经躺着了。例如:

def log[T]( t : Try[T]): Int =  //write to file and return 0  if Ok, else 128

此功能有副作用但也返回一个值。您现在可以将此功能传递给Future,但它不会返回Unit,结果会被丢弃,但您可以重复使用已有的功能。

答案 1 :(得分:0)

一个非常简单的例子应该清除云

val a = Future(1/2)
a.onComplete[String]({
  case Success(1) => "StringValue"         
})

此处 U 是字符串, T 是成功中的Int。

现在在大多数情况下,scala了解数据类型是什么,我们不需要特别提及类型U和T

如果我们更改String" StringValue"上面的例子将导致错误别的什么

val a = Future(1/2)
a.onComplete[String]({
  case Success(1) => 1
})

编译错误 - 类型不匹配; found:Int(1)required:String

但是如果我们从完全删除String而不强制返回类型为String,则它将采用任何类型

val a=Future(1/2)
a.onComplete({
  case Success(1)=>1
  case Success(2) => "we found two"  
  case Success(3) => 1.0f
  case Success(_) => new RuntimeException("it was not expected")
})

编译好。 因此根据您的用例提供了返回多种类型的权力