Lambda语法笔记(一)

基础语法

  1. 无参数的情况 :
    val/var 变量名 = { 操作的代码 }

  2. 有参数的情况
    val/var 变量名 : (参数的类型,参数类型,...) -> 返回值类型 = {参数1,参数2,... -> 操作参数的代码 }

可等价于

// 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。

val/var 变量名 = { 参数1 : 类型,参数2 : 类型, ... -> 操作参数的代码 }

  1. lambda表达式作为函数中的参数的时候,这里举一个例子:
    fun test(a : Int, 参数名 : (参数1 : 类型,参数2 : 类型, ... ) -> 表达式返回类型){
    ...
    }

源码

// 传入两个 int 值,返回之和
fun test(a : Int , b : Int) : Int{

    return a + b
    
}

lambda

1 . val test : (Int , Int) -> Int = {a , b -> a + b}

// 或者

2 . val test = {a : Int , b : Int -> a + b}

第一种: 会限制返回值类型

  • 在变量名后面接上传入的参数
  • "->"后为返回值类型
  • "{**}" 内 "->"前为传入的参数名
  • "{**}" 内 "->"后为具体的方法

第二种: 不会限制返回值类型

  • "{**}" 内 "->"前为传入的参数名和参数类型
  • "{**}" 内 "->"后为具体的方法

返回值确定规则

"{**}" 内 "->"后,最后一个参数或者函数为默认返回值,不需要用 return

不同操作之间需要用回车区分(不能在同一行)

val test1: (Int, Int) -> Int = { a, b
    ->
    " " // 操作一
    for (i in 0..15) { // 操作二

    }
    a + b // 操作三 : 返回值
}

Lambda高阶函数

用java在实际开发中,如遇到以下情况

A.class 中,构造方法中一个接口作为参数,需要其他类实现.

    private final AiTest aiTest;

    public A(AiTest aiTest) {
        this.aiTest = aiTest;
    }
    
    public interface AiTest {
        int onAi();
    }

B.class 中 , b()中生成A对象,并实现接口,return返回值

 public void b() {
        new A(new A.AiTest() {
            @Override
            public int onAi() {
            
                int result = 66 + 99;
                return result;
                
            }
        });
    }

那么下面在kotlin用Lambda实现

A.class

    fun aiTest (b : () -> Int) : Int{
    
        return b.invoke()
        
    }

B.class 中

    fun b() {
    
         A().aiTest  { 66 + 99 }
         
    }

invoke()函数:表示为通过函数变量调用自身,因为上面例子中的变量b是一个匿名函数。

在A.class括号中

b : () -> Int

val test : (Int , Int) -> Int = {a , b -> a + b}

中等号前半部分一样 ,后半部分在B.class类实现,从而达到了接口的效果

下划线(_)

在使用Lambda表达式的时候,可以用下划线(_)表示未使用的参数,表示不处理这个参数。

同时在遍历一个Map集合的时候,这当非常有用。

举例:

val map = mapOf("key1" to "value1","key2" to "value2","key3" to "value3")

map.forEach{
     key , value -> println("$key \t $value")
}

// 不需要key的时候
map.forEach{
    _ , value -> println("$value")
}

输出结果:
key1     value1
key2     value2
key3     value3
value1
value2
value3

你可能感兴趣的:(Lambda语法笔记(一))