Java8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23class test implements aa{
public String change(String str) {
return str;
}
public static void main(String[] args) {
test test = new test();
String append = test.append("123");
System.out.println(append);//123abc
}
}
interface aa{
abstract String change(String str);
default String append(String str){
return str+"abc";
}
}lambda 表达式,是一种简洁的语法,实际上是一个匿名函数。所有的 lambda 表达式都是用新的 lambda 运算符
->
,可以叫他 “转到” 或者 “成为”。运算符表达式分为两部分,左边指定输入参数,右边是 lambda 的主体。lambda 表达式返回右边表达式的结果。lambda 表达式默认重写 Runnable 接口的 run 方法,也就是说 lambda 表达式的内容默认是作为 Runnable 接口的 run() 方法。故 lambda 语句可以这么写:
1 | Runnable aa = () -> System.out.println("aa"); |
1 和 2 都会打印字符串 aa
方法与构造函数引用:Java8 允许使用
::
关键字来传递方法或者构造函数的引用,其实就是将类中的方法提取出来使用,使用时需要利用 FunctionalInterface 进行接收函数式接口:将 lambda 表达式映射到一个单方法的接口上。“函数式接口” 是指仅仅只包含一个抽象方法的接口,定义了这种类型的接口,使得以其作为参数的方法,可以在调用时,使用一个 lambda 表达式作为参数。也就是说在父类引用指向子类对象)时,= 右边可以直接通过 lambda表达式实现这个接口的唯一抽象方法。每一个该类型的 lambda 表达式都会被匹配到这个抽象方法
1 | public class lam { |
- 访问局部变量,我们可以直接在 lambda 表达式中访问外层的局部变量
1 | public class lam { |