Kotlin Lambda表达式

用法:{[参数列表] ->[函数体,最后一行是返回值]}//不实用fun修饰,用法跟匿名函数一样
举例
val sum ={a:Int,b:Int -> a+b}

参数和返回值:
1> ( ) -> Unit //无参数 ,返回值的类型为Unit
2> (Int) -> Int //Int类型的参数,返回值得类型为Int
3> (String,(String) ->String) ->Boolean //两个参数,第一个参数为String,第二个参数为Lambda表达式,返回值为Boolean
使用调用( ),例如sum(1,2)或者sum.invoke(1,2)

Lambda表达式的简化
1>函数参数调用时,最后一个Lambda可以移除去
2>函数参数只有一个Lambda,调用小括号可以省略
3>Lambda只有一个参数,可以默认使用it
4>入参,返回值与形参一致的函数可以使用引用的方式作为实参传入

package com.testlambda

/**
 * Created by jingwen on 19/4/14.
 */
fun main(args: Array<String>) {//Array -> Unit
    var a:Int = 1;
    var b:Int = 2;
    var sum1 =  sum(a,b)
    var sum2 = sum.invoke(a,b)
    println("$a+$b=$sum1")
    println("$a+$b=$sum2")
}

val sum = {a:Int,b:Int -> a+b}//Int,Int -> Int

执行结果:

1+2=3
1+2=3

Process finished with exit code 0

sum.invoke(1,2)//是function里面的function2,总共有23个,不能多于23个参数

Functions.kt
package kotlin.jvm.functions
/** 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
}
/** A function that takes 22 arguments. */
public interface Function22<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, in P19, in P20, in P21, in P22, out R> : Function<R> {
    /** Invokes the function with the specified arguments. */
    public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22): R
}
package com.com.pkg.test

/**
 * Created by jingwen on 19/4/14.
 */
fun main(args: Array<String>) {
    //调用方法1
  printSay();
    //调用方法2
  printSay.invoke()

  var studentNames:Array<String> = arrayOf("jingwen","chengcheng","zhulina")
    //方法1
    println("学生的名字(方法1):")
    for(name in studentNames){
        println(name)
    }
//forEach是Array的扩展方法
//    /**
//     * Performs the given [action] on each element.
//     */
//    public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {
//        for (element in this) action(element)
//    }


    //方法2
    println("学生的名字(方法2):")
    studentNames.forEach({ it ->
        println(it)
    })
    //方法3
    println("学生的名字(方法3):")
    studentNames.forEach() {
        println(it)
    }

    //方法4
    println("学生的名字(方法4):")
    studentNames.forEach {
        println(it)
    }

    //方法5
    println("学生的名字(方法5):")
    studentNames.forEach(::println)

    //方法6
    println("学生的名字(方法6):")//参数的名字可以修改的哈
    studentNames.forEach { ss ->
        println(ss)
    }

    //参数和类型
    println(::printSay)

    println("end")


}

//无参数 Lambda表但是 ()->Unit
val printSay = {
    println("jingwen: hello world!")
}

结果:

jingwen: hello world!
jingwen: hello world!
学生的名字(方法1):
jingwen
chengcheng
zhulina
学生的名字(方法2):
jingwen
chengcheng
zhulina
学生的名字(方法3):
jingwen
chengcheng
zhulina
学生的名字(方法4):
jingwen
chengcheng
zhulina
学生的名字(方法5):
jingwen
chengcheng
zhulina
学生的名字(方法6):
jingwen
chengcheng
zhulina
val printSay: () -> kotlin.Unit
end

猜你喜欢

转载自blog.csdn.net/jingwen3699/article/details/89294843