高阶函数
- 将函数作为一个对象,例如,函数的参数是一个函数,变量类型为一个函数
关心函数的返回值
class FunctionTest {
@Test
fun test() {
application()
println(ABTest.isNewVip.invoke())
}
private fun application() {
ABTest.isNewVip = {
println("application")
true
}
}
}
object ABTest {
var isNewVip: (() -> Boolean) = { false }
}
application
true
使用场景
data class ApiResponse<T>(
val error: Boolean,
val results: List<T>
)
data class ApiResult<T>(val success: Boolean, val data: T) {
companion object {
inline fun <T> create(request: () -> ApiResponse<T>): List<T> {
return try {
val response = request.invoke()
response.results
} catch (e: Exception) {
if (e is UnknownHostException) {
ToastUtils.showShort("连接服务器失败")
} else if (e is InterruptedIOException) {
ToastUtils.showShort("连接服务器超时")
} else if (e is JSONException || e is JsonParseException || e is ParseException) {
ToastUtils.showShort("数据解析出错")
} else {
ToastUtils.showShort("未知的网络错误")
}
Log.e("ApiResult", "create: " + e.message)
emptyList()
}
}
}
}
关心函数的参数
class FunctionTest {
@Test
fun test() {
create { it1, it2 ->
println(2)
println(it1)
println(it2)
}
}
private fun create(request: (param1: Int, param2: Int) -> Unit) {
println(1)
request.invoke(3,4)
println(5)
}
}
1
2
3
4
5
使用场景
object LoginUtil {
var loginState:(isLogin: Boolean) -> Unit = {}
fun requireLogin(context: Context, loginState: (isLogin: Boolean) -> Unit) {
this.loginState = loginState
LoginActivity.start(context)
}
}
class LoginActivity : AppCompatActivity() {
companion object {
fun start(context: Context) {
val starter = Intent(context, LoginActivity::class.java)
context.startActivity(starter)
}
}
private lateinit var binding:ActivityLogin2Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_login2)
binding.btLoginSuccess.setOnClickListener { LoginUtil.loginState.invoke(true) }
binding.btLoginFailed.setOnClickListener { LoginUtil.loginState.invoke(false) }
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
LoginUtil.requireLogin(this) {
Toast.makeText(this, "登录结果:$it", Toast.LENGTH_SHORT).show()
}
}
}