选用教材:《Java核心技术卷一》
第六章 接口、Lambda表达式与内部类
强烈建议所有需要学习Lambda表达式的朋友们,在看书之前,先看看千峰的视频:
https://www.bilibili.com/video/BV164411E7Ny?p=11
自己看书的话,很容易被逻辑绕进去。
一、Lambda表达式的基本语法
1、例:(String a,Stringb)->{return a.length-b.length;};
()里放的是参数列表;
->是Lambda运算符,读作goes to;
{}里是表达式的主体部分,用来执行一些逻辑语句及返回语句。
2、Lambda表达式的精简版本:
①()里的参数,若有2个及以上,则可以省略掉前面的类型。但是一定要全部省略,不能一个参数省了类型,另一个参数没省。
②{}里若只有一条返回语句,那么可以把大括号省略掉。
③在第②条的基础上,还可以把return语句的return关键字也省略掉。
④若()里只有一个参数,那么不仅前面的类型可以省略,小括号也可以去掉不要。
二、Lambda表达式与接口的关系(主观)
前面讲接口的那些章节,基本是在强调:要想调用接口里的方法,那么类就必须先实现这个接口。
而学了Lambda表达式之后,感觉这个实现接口的过程被简化了。
归根结底,是因为Java是一种强类型语言。
就拿比较常见的sort排序方法来说,不是任何一个Object类对象都可以调用这个方法的。
很多都需要通过接口来将类对象转换成sort方法需要的对象。Lambda表达式就直接把实现接口的过程给省略掉了。
三、函数式接口
即能接收Lambda表达式的接口。
常用的有以下4个:
1、Supplier<T>;
2、Consumer<T>;
3、Fuction<T,R>;
4、Predicate<T>
四、方法引用
1、基本语法:方法的隶属者::方法
例:System.out::println
静态方法的隶属者是类,其他方法的隶属者是对象。
2、不是所有的Lambda表达式都能写成方法引用的形式。
例如:s->s.length()==0
不仅调用了方法,还进行了判断。当且仅当Lambda表达式只调用了一个方法而不做其他操作时,才能重写为方法引用的形式。
3、构造器引用的基本语法
例:Person[] people=Steam.toArray(Person[]::new);
调用了Person类的构造器,并创建了一个实例。
五、Lambda表达式和接口的高级组合用法
例:static Supplier<Integer>getNumber()
{
int num=10;
return()->{return num;};
}