1、接口改善
a.接口中可以定义静态方法
b.更重要的是,接口中的方法,可以用default修饰后,添加方法体
2、函数式接口
核心概念就是函数式接口。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。比如,java.lang.Runnable就是一个函数式接口,因为它只定义一个抽象方法:
public abstract void run();
什么是函数式接口,有两种情况:
1.接口只有一个抽象方法,abstract修饰
2.接口只有一个抽象方法,abstract修饰。同时,包含多个默认方法,因为默认方式是被default修饰,不是被abstract修饰。
同时,引入了一个新的Annotation:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。加上它的接口不会被编译,除非你设法把它变成一个函数式接口。它有点像@Override,都是声明了一种使用意图,避免你把它用错。
3、Lambdas
一个函数式接口非常有价值的属性就是他们能够用lambdas来实例化。这里有一些lambdas的例子:
左边是指定类型的逗号分割的输入列表,右边是带有return的代码块:
(int x, int y) -> { return x + y; }
左边是推导类型的逗号分割的输入列表,右边是返回值:
(x, y) -> x + y
左边是推导类型的单一参数,右边是一个返回值:
x -> x * x
左边没有输入 (官方名称: “burger arrow”),在右边返回一个值:
() -> x
左边是推导类型的单一参数,右边是没返回值的代码块(返回void):
x -> { System.out.println(x); }
静态方法引用:
String::valueOf
非静态方法引用:
Object::toString
继承的函数引用:
x::toString
构造函数引用:
ArrayList::new