Kotlin中的高阶函数的使用

高阶函数

  • 将函数作为一个对象,例如,函数的参数是一个函数,变量类型为一个函数

关心函数的返回值

  • 参数为一个函数,并关心其返回值
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()
        }
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值