Kotlin学习教程(七)

Kotlin学习教程(七)

这篇文章主要学习下lambda表达式。因为后续一些例子会用到。

“Lambda 表达式”(lambda expression)其实就是匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象
(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。

// 没有使用Lambda的老方法:   
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
        System.out.println("Actiondetected");
    }
});
// 使用Lambda:  
button.addActionListener(()->{ 
    System.out.println("Actiondetected");
});


// 不采用Lambda的老方法: 
Runnable runnable1=new Runnable(){
    @Override
    public void run(){
        System.out.println("RunningwithoutLambda");
    }
};
// 使用Lambda:   
Runnable runnable2=()->{
    System.out.println("RunningfromLambda");
};

Lambda能让代码更简洁,而主打简洁的Kotlin怎么可能不支持呢? 当然会支持。

下面来看看一个简短的概述:

  • lambda表达式总是被大括号括着
  • 其参数(如果有的话)在->之前声明(参数类型可以省略),
  • 函数体(如果存在的话)在->后面。

Lambda表达式是定义匿名函数的简单方法。由于Lambda表达式避免在抽象类或接口中编写明确的函数声明,进而也避免了类的实现部分,
所以它是非常有用的。在Kotlin语言中,可以将一函数作为另一函数的参数。

Lambda表达式由箭头左侧函数的参数(在圆括号里的内容)定义的,将值返回到箭头右侧。
view.setOnClickListener({ view -> toast("Click")})
在定义函数时,必须在箭头的左侧用方括号,并指定参数值,而函数的执行代码在箭头右侧。如果左侧不使用参数,甚至可以省去左侧部分:
view.setOnClickListener({ toast("Click") })
如果函数的最后一个参数是一个函数的话,可以将作为参数的函数移到圆括号外面:
view.setOnClickListener() { toast("Click") }

先看一个例子:

fun compare(a: String, b: String): Boolean {
    return a.length < b.length
}
max(strings, compare)

就是找出strings里面最长的那个。但是我个人觉得compare还是很碍眼的,因为我并不想在后面引用他,那我怎么办呢,就是用“匿名函数”方式。

max(strings, (a,b)->{a.length < b.length})

(a,b)->{a.length < b.length}就是一个没有名字的函数,直接作为参数赋给max方法的第二个参数。但这个方法有很多东西都没有写明,如:

  • 参数的类型
  • 返回值的类型

但这些真的必要吗?a.length < b.length很明显返回一个Boolean的值,再就是max的定义中肯定也定义了这个函数的参数类型和返回值类型。
这么明显的事为什么不让计算机自己去做而要让人写代码去做呢?这就是匿名函数的好处了。到这里,我们已经和Lambda很接近了。

val sum: (Int, Int) -> Int = { x, y -> x + y }

Lambda表达式就是被大括号括着的那一部分,在->符号之前有参数声明,函数体跟在一个->符号之后。
而且此Lambda表达式之前有一个匿名的函数声明(在此例中两个Int型的输入,一个Int型的返回值),这个声明是可以不使用的。
则此Lambda表达式变成val sum = { x: Int, y: Int -> x + y },此时Lambda表达式会根据主体中的最后一个(或可能是单个)表达式会视为
返回值。当然,在某些特定情况下,xy的类型了是可以推断的,所以val sum = { x, y -> x + y }


更多文章请查看AndroidNote

你的star是我的动力!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值