jdk8在公司使用非常广泛,lambda表达式的使用相对频繁,学会lambda表达式对读代码还是相当有必要。
废话不多说,总结如下,看这一篇就够了:
lambda表达式其实是一种相对省略的写法,可以使代码看起来简洁优雅。我们先来看下其形式:
(int o1,int o2)->{//执行体};
初学的时候有点蒙,但不要慌,其实多看几次慢慢理解消化吸收了就非常简单实用。所以重点来了,我们先要弄清楚以下几点:
1、使用lambda表达式的目的是什么,我们为什么要用lambda表达式?
lambda表达式无非就是为了省略接口实现类的书写,让代码看起来高大上点。也就是当某个接口,只有一个抽象方法时,其实我们完全没必要再去写这个接口实现类了,这时候我们只需要通过lambda表达式,直接重写这个接口类的抽象方法即可
2、lambda表达式的返回值是什么?
lambda表达式的返回值是接口的一个实现类
3、lambda表达式的具体语法
很简单,->左边是抽象方法的入参,右边是抽象方法的具体实现
以上三点lambda表达式基本就够了,还有一些就是为了更加简洁,lambda表达式还有一些可以省略的地方,使代码看起来美观(其实没什么屌用),总结起来也同样只有三点:
1、自动类型推断,其实lambda表达式不需要给出入参的类型(也就是->左边的内容,因为这些在接口定义的时候已经规定好了,不需要再给出入参的类型了,也就是缩写成以下方式就可以)
(o1,o2)->{//执行体};
2、当入参只有一个时,括号可以省略(注:当没有入参时,不能省略括号)
o1->{//执行体};
3、如果执行体只有一条执行语句(可能是return语句),则可以省略大括号和return关键字(要省就一起省,不能只省略大括号)
例如:(o1,o2)->o1.compareTo(o2);(1)
以上三点总结完毕!最后一个是不是看起来有一点眼熟,我们补全
Comparator<Integer> com1 = (o1,o2)->o1.compareTo(o2); (2)
如果我们不用lambda表达式也是可以达到这个效果的,只不过需要生成一个匿名内部类,去重写他的compareTo方法
(3)
Comparator<Integer> com2 = new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
return o1.compareTo(o2);
}
};
(1)、(2)、(3)表达的完全是同一个意思,lambda表达式只需要一步就可以到位
再者就是结合函数式接口使用了,属于更进一步的应用了,我在下篇博客详解介绍