/** 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如何使用它?
同样的问题适用于onSuccess
和onFailure
修改以更清楚地了解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
答案 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")
})
编译好。 因此根据您的用例提供了返回多种类型的权力