Future.onComplete: 无法理解方法签名
Future.onComplete: can't understand the method signature
/** 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
}
})
这个函数似乎对产生副作用很有用,因为它是 returns 单位(比如日志完成)
我不明白的是函数 return 的这种类型 U
是什么。我们提供的return类型的功能真的有用吗? Scala是如何使用的?
同样的问题可能适用于 onSuccess
和 onFailure
编辑: 为了更清楚,def onComplete[U](func: Try[T] => U)
比 def onComplete(func: Try[T] => Unit)
有什么好处?
编辑:
Chirlo 说得对,U 类型的函数更灵活,我们可以更轻松地传递它现有的没有 return 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
一个非常简单的例子应该清除云层
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
})
编译错误- 类型不匹配;发现:需要 Int(1):String
但是如果我们从 complete 中删除字符串并且不强制 return 类型为字符串,它将采用任何类型
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")
})
编译得很好。 因此给了我们 return 多种类型的能力,这取决于你的用例
使功能更加灵活。如果它 return Unit
,你可以只给它传递函数 Try[T] => Unit
,但是通过 returning U
,你可以给它传递任何需要 Try[T]
作为一个参数,你可能已经在身边了。例如:
def log[T]( t : Try[T]): Int = //write to file and return 0 if Ok, else 128
此函数有副作用,但也 return 是一个值。您现在可以将此函数传递给您的 Future
,尽管它不会 return Unit
,结果将被丢弃,但您可以重用已经存在的函数。
/** 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
}
})
这个函数似乎对产生副作用很有用,因为它是 returns 单位(比如日志完成)
我不明白的是函数 return 的这种类型 U
是什么。我们提供的return类型的功能真的有用吗? Scala是如何使用的?
同样的问题可能适用于 onSuccess
和 onFailure
编辑: 为了更清楚,def onComplete[U](func: Try[T] => U)
比 def onComplete(func: Try[T] => Unit)
有什么好处?
编辑:
Chirlo 说得对,U 类型的函数更灵活,我们可以更轻松地传递它现有的没有 return 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
一个非常简单的例子应该清除云层
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
})
编译错误- 类型不匹配;发现:需要 Int(1):String
但是如果我们从 complete 中删除字符串并且不强制 return 类型为字符串,它将采用任何类型
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")
})
编译得很好。 因此给了我们 return 多种类型的能力,这取决于你的用例
使功能更加灵活。如果它 return Unit
,你可以只给它传递函数 Try[T] => Unit
,但是通过 returning U
,你可以给它传递任何需要 Try[T]
作为一个参数,你可能已经在身边了。例如:
def log[T]( t : Try[T]): Int = //write to file and return 0 if Ok, else 128
此函数有副作用,但也 return 是一个值。您现在可以将此函数传递给您的 Future
,尽管它不会 return Unit
,结果将被丢弃,但您可以重用已经存在的函数。