kotlin

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
    }
}
上一篇下一篇

猜你喜欢

热点阅读