package weather.qf.kotlin_coroutine_demo
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.*
//****可以执行****
class QueryBjClass {
suspend fun searchCity(keyword: String){
println("+++")
}
}
fun
// CoroutineScope.
searchCity(keyword: String){
println("+++")
}
fun main()= runBlocking {
//第一、二、四行这样引用searchCity不会执行,也没报错 方法引用::searchCity放在lambda的方法体内,不会执行,需要在参数位置上直接引用 或在lambda的方法体内调用方法
//第三行才会执行
//第五行直接引用::searchCity找不到launch方法
launch("北京", { -> QueryBjClass::searchCity })
launch("北京", {str-> QueryBjClass()::searchCity })
launch("北京", {str-> QueryBjClass().searchCity(str) })
launch("北京", {str-> ::searchCity })
launch("北京", {str-> searchCity(str) })
launch("北京",
// CoroutineScope::
::searchCity ) //找不到launch方法,方法不匹配.把launch中的接收者类型去掉,或给顶级的searchCity变成CoroutineScope的扩展函数,传入时也加上CoroutineScope,就可以了
launch("北京", { -> println("str") })
launch("北京", { str ->
println("str")
println(str)
})
}
@JvmName("launch1")
fun launch(keyword: String, block: suspend
//CoroutineScope.
(String) -> Unit){
// GlobalScope.launch
runBlocking{
withContext(Dispatchers.IO){
println("11+==")
//就像Java 反射 Method调用一样,传入对象与方法参数,没有方法参数和接收者类型可以直接block()调用,没有接收者类型,就不要传this
// 或者 block().invoke(this) 也可以
//根据情况调用:block(keyword)等价于block.invoke(keyword) , block() 、 block.invoke(this) 、 block.invoke(this,keyword) 有接收者类型,并且使用invoke调用,必须传入this
// block.invoke(
// this,
// keyword)
// .invoke(this)
block(keyword)
println("12+==")
}
}
}
fun launch(keyword: String, block: suspend CoroutineScope.() -> Unit){
// GlobalScope.launch
runBlocking{
withContext(Dispatchers.IO){
println("21+==")
block()
// 或者 block().invoke(this) 也可以
println("23+==")
}
}
}
kotlin 方法引用作为参数传入
最新推荐文章于 2024-04-11 06:47:18 发布