点击领取优惠~
762 字
4 分钟
内联和高阶函数
关键不是问你什么概念,而是看你在实际使用中有没有注意这些细节
- 内联函数:编译时把调用代码插入到函数中,避免方法调用的开销。
- 高阶函数:接受一个或多个函数类型的参数,并/或返回一个函数类型的值 概念就这两句话,实际使用的时候却有很大的用途。比如我们常用的apply、run、let这些其实就是一个内联高阶函数。
// applypublic inline fun <T> T.apply(block: T.() -> Unit): T { block() return this }// runpublic inline fun <T, R> T.run(block: T.() -> R): R { return block() }// letpublic inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }使用心得
-
有时候为了代码整洁,我们不会让一个方法超过一屏幕,会把里面的方法抽成几个小的方法,但是方法会涉及到入栈出栈,而内联函数就可以保证代码的整洁又避免了方法进栈出栈的开销。这个是我们稍微注意一下很方便做的优化。
-
为了简化函数的调用我们可以使用高阶函数,除了系统提供的apply、run、let这些外,自己其实平时也会写一些高阶函数,比如下面的例子
- 使用高阶函数增加代码可读性
// 使用高阶函数简化网络请求处理fun <T> Call<T>.enqueue( onSuccess: (response: Response<T>) -> Unit, onError: (error: Throwable) -> Unit, onCancel: () -> Unit) { enqueue(object : Callback<T> { override fun onResponse(call: Call<T>, response: Response<T>) { if (response.isSuccessful) { onSuccess(response) } else { onError(Exception("Request failed with code ${response.code()}")) } }
override fun onFailure(call: Call<T>, t: Throwable) { if (!call.isCanceled) { onError(t) } else { onCancel() } } })}
// 使用的时候 call.enqueue( onSuccess = { response -> // 在这里处理网络请求成功的逻辑
}, onError = { error -> // 在这里处理网络请求失败的逻辑 }, onCancel = { // 在这里处理网络请求取消的逻辑 } )- 使用高阶函数减少无用回调,方便使用
// 使用高阶函数简化回调函数fun EditText.doOnTextChanged(action: (text: CharSequence?, start: Int, before: Int, count: Int) -> Unit) { addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { action(s, start, before, count) }
override fun afterTextChanged(s: Editable?) { } })}
// 使用的时候只需要关系一个回调就可以 editText.doOnTextChanged { text, _, _, _ -> // 在这里处理输入框文本变化的逻辑 }说明了高阶函数的作用,可以简化一些操作,也可以增强可读性。其实还有一些其他的作用比如用高阶函数实现RecycleView初始化时的函数式编程、对一些方法添加缓存等等。 只要涉及到对原有方法的增强或者简化或者添加多一层封装实现链式调用都可以考虑使用高阶函数。
作者:浪人笔记 链接:https://juejin.cn/post/7220344703588532261 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内联和高阶函数