【6】kotlin Lambda 表达式

 

Lambda

什么是Lambda?

  • 其实就是匿名函数

写法

  • {[参数列表]->[函数体,最后一行是返回值]}

类型举例

  • ()->Unit 
  • 无参。返回值为Unit
  • (Int)->Int
  • 传入整型,返回一个整型
  • (String,(String->String)->Boolean)
  • 传入字符串、Lambda表达式。返回Boolean

调用

  • 用()调用
  • 等价于invoke()

简化

  • 函数参数调用时最后一个Lambda可以移出去
  • 函数参数只有一个Lambda。调用时小括号可以省略
  • Lambda只有一个参数可默认为it
  • 入参、返回值与形参一致的函数可以用函数引用的方式作为实参传入
package com.yzdzy.kotlin
//(Array<String>) -> Unit
fun main(args: Array<String>) {


    var sum = { arg1: Int, arg2: Int ->
        println("$arg1+$arg2=${arg1 + arg2}")
        //最后一行 为返回值
        arg1 + arg2
    }

    println(sum(2, 4))
    //相等于这个
    println(sum.invoke(2, 4))
    //()-> Unit     匿名函数就是lambda
    var printLnHello = {
        println("Hello")
    }
    //匿名函数也有类型
    //(Int) -> Long
    //有名的函数 类型 ()-> Unit
    fun printUsage(){
        println("请传入两个整型参数,例如1 2")
    }
    //println 类型  (Any?)->Unit  传入可空。返回 Lambda

//    请按照顺序阅读代码 当前是1
    println("1------------------")

    for (i in args) {
        println(i)
    }
    println("2------------------")
    args.forEach {
        println(it)
    }
    println("3------------------")
    //如果最后一个参数是lambda
    args.forEach({ it ->
        println(it)
    })
    println("4------------------")
// 可以把小括号移动到前面  如果前面小括号里面什么都没有还可以删除掉
    args.forEach() { it ->
        println(it)
    }
    println("5------------------")
    //如果传入的函数和需要接受的lambda的参数是一样的
    // alt+enter 使用 convert lambda 可以简化到下面
    args.forEach(::println)
    //遍历输入 如果是x 终止迭代 加标签的方式 终止当前的迭代
    println("7------------------")
    args.forEach ForEach@{
        if (it == "x") return@ForEach
        //retrun 的是main 函数 所有下面的7------------执行不到
        println(it)
    }

    println("6------------------")
    println("9------------------")
    //Function2<java.lang.Integer, java.lang.Integer, java.lang.Integer>
    println(sum)

//    可以全局搜索下Function2
    /*
    * /** A function that takes 2 arguments. */
public interface Function2<in P1, in P2, out R> : Function<R> {
    /** Invokes the function with the specified arguments. */
    public operator fun invoke(p1: P1, p2: P2): R
}*/

    println(printLnHello)
    println("10------------------")
    //function printUsage (Kotlin reflection is not available)
    println(::printUsage)
    //true 所以是Function0
    println(::printUsage is ()->Unit)
//    类是从 Function0-22个 根据参数的个数
    //那么问题来了 当参数大于22呢 23个参数的函数呢、、编译不会报错
//    但是运行会报错 但是我们一般不会传递这么多参数

    
    args.forEach {
        if (it == "x") return
        //retrun 的是main 函数 所有下面的7------------执行不到
        println(it)
    }

    println("8------------------")

}

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/106002880
今日推荐