Android Kotlin 高阶函数浅谈
2019-08-26 本文已影响0人
水天滑稽天照八野滑稽石
前言
真香的东西,肯定是要吹爆的,这辈子已经离不开高阶函数了,所以来简单聊下
何为高阶函数
将函数用作一个函数的返回值来使用
我们正常的函数使用的都是函数的返回值,就是基本数据类型或者自定义类型那些
fun function1(name: String){}
fun function2 (student: Student){}
而高阶函数就是把整个函数丢进去,来看个小demo吧
class MainActivity : AppCompatActivity() {
private lateinit var myModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1.setOnClickListener {
higherFunction {
text.text = "xiao"
}
}
}
fun higherFunction(function: () -> Unit ){
function.invoke()
}
}
invoke
好像有点意思哟~
像这种把代码片段直接插入其他地方执行在java里面我们有两种写法
抽象类
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val uitl = object : AbstractUitl(){
override fun method(s: String): String {
return s
}
}
text.setOnClickListener {
text.text = uitl.deal("xiao")
}
}
}
abstract class AbstractUitl {
fun deal(s: String): String{
return method(s)
}
abstract fun method(s: String): String
}
接口回调
class MainActivity : AppCompatActivity() {
private lateinit var myModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1.setOnClickListener {
text.text = Until().deal(object : Impl {
override fun mothod(s: String): String {
return s
}
}, "xiao")
}
}
interface Impl {
fun mothod(s: String): String
}
class Until {
fun deal(impl: Impl, s: String): String {
return impl.mothod(s)
}
}
}
写起来好麻烦啊...好多代码,可读性又差...你看高阶函数来写多香啊
代码少又好看
刚刚上面说提到高阶函数,就是高阶函数的用途的精髓之一了,invoke()这个方法作用是将传入的高阶函数执行
语法规则
//挺简单的用法
fun higherFunction(function: () -> Unit ) { }
fun higherFunction(fun2: (a:Int,b: String) -> String) { }
其实用Kotlin来开发Android,官网很多地方也是这样写的,如:
button1.setOnClickListener { }
你看,This is高阶函数,其实也没多么难
在Kotlin 里面,高阶函数还有这些常用的操作符,用来简化代码的书写(感觉常用就这2个)
let
在函数块内可以通过 it 指代该对象;返回值为函数块的最后一行或指定return表达式
class Student{
var name = "xiao"
var age = 12
}
fun main(){
var student = Student()
var a = student.let {
it.name
it.age
}
//a = 12
}
fun main(){
var student = Student()
var a = student.let {
it.name
it.age
return@let "name"
}
//a = "name"
}
apply
在函数块内返回的传入对象的本身
class Student{
var name = "xiao"
var age = 12
}
fun main(){
var student = Student()
var student.apply{
age
name
}
}