kotlin - Lambda表达式高阶函数的使用

2020-08-05  本文已影响0人  dashingqi
Android_Banner.jpg

简介

函数作为参数使用

/**
     * 这是用来测试Lambda作为参数的测试
     */
    private fun testAsParameter() {
        //定一个Int数组
        val list = 1..20

        // 筛选能被5整除的
        println("==========================")

        println(list.pickNUm({ x: Int -> x % 5 == 0 }))

        //筛选能被10整除的

        println("==========================")

        println(list.pickNUm({ y: Int -> y % 10 == 0 }))
    }
    
     /**
     * function: (Int) -> Boolean
     *
     * function: 形式参数名,可以任意修改
     *
     * (Int) -> Boolean 形式参数类型 这里描述的是一个函数类型,函数的参数是Int类型 函数的返回值是Boolean类型的
     */
    private fun IntRange.pickNUm(function: (Int) -> Boolean): List<Int> {

        //声明一个集合
        val resultList = mutableListOf<Int>()

        // this 指向定义的区间范围(IntRange)
        for (i in this) {
            if (function(i)) {
                resultList.add(i)
            }
        }
        return resultList
    }
2020-08-02 15:16:30.953 17661-17661/com.dashingqi.module.lambda I/System.out: ==========================
2020-08-02 15:16:30.953 17661-17661/com.dashingqi.module.lambda I/System.out: [5, 10, 15, 20]
2020-08-02 15:16:30.953 17661-17661/com.dashingqi.module.lambda I/System.out: ==========================
2020-08-02 15:16:30.953 17661-17661/com.dashingqi.module.lambda I/System.out: [10, 20]

函数作为参数的优化

省略小括号
/**
     * function: (Int) -> Boolean
     *
     * function: 形式参数名,可以任意修改
     *
     * (Int) -> Boolean 形式参数类型 这里描述的是一个函数类型,函数的参数是Int类型 函数的返回值是Boolean类型的
     */
    private fun IntRange.pickNUm(function: (Int) -> Boolean): List<Int> {

        //声明一个集合
        val resultList = mutableListOf<Int>()

        // this 指向定义的区间范围(IntRange)
        for (i in this) {
            if (function(i)) {
                resultList.add(i)
            }
        }
        return resultList
    }
    
  /**
     * 这是用来测试Lambda作为参数的测试
     */
    private fun testAsParameter() {
        //定一个Int数组
        val list = 1..20
        //筛选能被10整除的
        println("==========================")
        //省略之前
        println(list.pickNUm({ y: Int -> y % 10 == 0 }))
        //省略之后
        println(list.pickNUm { y: Int -> y % 10 == 0 })
    }
将参数移动到小括号外面

如果一个函数有多个参数,但是最后一个参数类型是函数类型,那么在调用函数的时候,可以将最后一个参数从括号中移出。

    /**
     * 这是用来测试Lambda作为参数的测试
     */
    private fun testAsParameter() {
        //定一个Int数组
        val list = 1..20
        println("==========================")
        //将参数移动到小括号外面之前
        println(list.pickNUm(1, { y: Int -> y % 10 == 0 }))
        //将参数移动到小括号外面之后
        println(list.pickNUm(2) { y: Int -> y % 10 == 0 })
    }

    /**
     * function: (Int) -> Boolean
     *
     * function: 形式参数名,可以任意修改
     *
     * (Int) -> Boolean 形式参数类型 这里描述的是一个函数类型,函数的参数是Int类型 函数的返回值是Boolean类型的
     */
    private fun IntRange.pickNUm(need: Int, function: (Int) -> Boolean): List<Int> {

        //声明一个集合
        val resultList = mutableListOf<Int>()

        // this 指向定义的区间范围(IntRange)
        for (i in this) {
            if (function(i)) {
                resultList.add(i)
            }
        }
        return resultList
    }
使用it关键字

无论函数包括多少个参数,如果其中有参数是函数类型,并且函数类型满足仅仅接受一个参数的要求,可以用it关键字代替函数的形参以及箭头

  /**
     * 这是用来测试Lambda作为参数的测试
     */
    private fun testAsParameter() {
        //定一个Int数组
        val list = 1..20
        //筛选能被10整除的
        println("==========================")
        //没有使用it关键字之前
        println(list.pickNUm(2) { y: Int -> y % 10 == 0 })
        //使用关键字之后
        println(list.pickNUm(2) { it % 10 == 0 })
    }

    /**
     * function: (Int) -> Boolean
     *
     * function: 形式参数名,可以任意修改
     *
     * (Int) -> Boolean 形式参数类型 这里描述的是一个函数类型,函数的参数是Int类型 函数的返回值是Boolean类型的
     */
    private fun IntRange.pickNUm(need: Int, function: (Int) -> Boolean): List<Int> {

        //声明一个集合
        val resultList = mutableListOf<Int>()

        // this 指向定义的区间范围(IntRange)
        for (i in this) {
            if (function(i)) {
                resultList.add(i)
            }
        }
        return resultList
    }

函数作为返回值

fun testAsReturnValue() {
        val normalPrice = getPrice(USER.NORMAL)(400.0)
        println("normalPrice ----> $normalPrice")

        val vipPrice = getPrice(USER.VIP)(400.0)
        println("vipPrice ----> $vipPrice")
    }

    /**
     * lambda表达式作为返回值
     */
    private fun getPrice(userType: USER): (Double) -> Double {

        if (userType == USER.NORMAL) {
            return { it }
        }

        return { price -> 0.88 * price }

    }
上一篇 下一篇

猜你喜欢

热点阅读