-
复习:Lamda的省略规则:
- 接口名称
- 方法名称可以省略
- 参数类型可以省略
- 如果参数有且仅有一个,那么括号可以省略
- 如果语句有且仅有一个,那么无论有没有返回值,return可以省略
2、函数式接口
a. 概念:有且仅有一个需要实现的抽象方法的接口
b. 作用: 1)可以当做普通接口使用:implements、@Override
2)可以当做Lambda使用的前提
c. 注解:@FunctionInterface:用来检测是否是一个函数式接口
d. 注意:这个注解就算不写,也算是函数式接口,但是仍要写上为好。
3、接口
a. 无参数、无返回值的函数式接口
b. 有参数、有返回值的函数式接口
4、延迟执行
a. 如果条件满足,则执行lamda,否则条件不足,不会执行lamda.
就是节省了性能资源。例如:拼接性能浪费。
5、使用lambda作为返回值
a. 使用Lambda作为方法的返回值,其实就是使用函数式接口作为方法的返回值。
b. 举例说明:
new Thread(new Runnable() {
@Override
public void run() {
// ...
}
}).start();
new Thread(() -> {...}).start();
Runnable task = () -> {...};
new Thread(task).start();
public static Runnable getRunnable() {
Runnable task = () -> {...};
return task;
}
Runnable task = getRunnable();
new Thread(task).start();
public static Runnable getRunnable() {
return () -> {...};
}
6、lambda的优化
a. 方法引用:本来Lambda的做法是:给我来一个字符串,然后我将它原封不动转交给
println方法。现在方法引用的做法是:直接去找println方法。
b. 使用建议:如果Lambda所做的事情,和已经存在的某一个方法所做的事情完全一样,
那么就可以省去Lambda转交的过程,直接使用方法引用。
c. 方法引用符“::”(两个英文冒号连写)
d. 备注:虽然方法引用“System.out::println”可以对应到很多个重载方法上。
只有一个(String str)这种参数才能直接匹配上。
7、关于方法引用“::”的写法常用的4+2用法:
a. 对于类的来说
a) 对象名引用成员方法名
格式:对象名::成员方法名
b) 通过类名称引用静态方法
格式:类名称::静态方法名
c) 通过super引用父类方法,
格式super::父类方法名
d) 通过this引用本类方法
格式this::本类方法名
b. 对于构造器来说
a) 类的构造器引用
格式:类名称::new
b) 数组的构造器引用
格式:数据类型 ::new
8、Java8 提供的函数式接口,全位于:Java.util.function包
a) Superlier<T>接口当中的唯一的抽象方法:
T get():作用是对外提供的一个指定泛型类型的对象。
b) consumer<T>函数式接口
i. java.util.function.consumer<T>
其中仍然只有一个抽象方法;
ii. Void accept(T t):消费一个数据
iii. 函数拼接
andThen方法可以将两个Consumer拼接成为一个大的Consumer,包含本来的两个动作。
先执行自己的accept拼接别人的accept,这两个动作弄到一个动作里,
然后这个过程就是andThen.
iv 使用步骤:
举例一、
举例二、
举例三、