只有一个 抽象方法的接口 称之为 函数式接口。函数式接口可以使用@FunctionalInterface进行注解。
函数式接口允许接口中存在默认方法和静态方法,但是只允许有一个抽象方法。
函数式接口可以使用Lambda 表达式,lambda表达式是函数式接口的一个实例,是一种简化的写法
(1) Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
本质上方法的参数还是接口类型,不过该接口是函数式接口,所以可以使用lambda表达式来传参,而Lambda 是一个函数。
(2) 让代码更加简洁
本来代码中需要创建接口的实现类或者使用匿名内部类,现在可以使用Lambda表达式,让代码更加简介。
(parameters) -> expression
或
(parameters) ->{ statements; }
- 可选parameters类型声明:parameters可以声明类型,也可以不声明。编译器可以统一识别参数值。
- 可选parameters圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句(expression),就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式(expression)并且有返回值,则不用写return关键字。如果有多条语句,使用了大括号需要使用return返回。
// 1. 无参数,无返回值
() -> System.out.print(“111”)
// 2. 一个参数,无返回值
x -> System.out.print(x)
// 3. 一个参数,有返回值
x -> 2*x
// 4. 多个参数,多条语句
(int x, int y) ->{
System.out.print(x)
return x + y
}
4.注意事项
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
原因是lambda表达式是个闭包,即方法中是在栈中的,方法结束就会被回收。但是lambda表达式可以访问其他作用域中的变量,为了不让这些变量被回收,所以让这些变量为final 。
Consumer :
void accept(T t);
2.供给型接口
Supplier :
T get();
3.函数型接口
Function :
R apply(T t);
4.断言型接口
Predicate :
boolean test(T t);
四、方法引用
就是对Lambda表达式的一种替换写法; 将Lambda表达式替换为 一个已经存在了的方法, 且替换方法的方法体的内容与Lambda的内容一致。
1.调用特定对象的实例方法注意的是调用对象实例方法的参数和返回值要和lambda表达式的参数和返回值一样才行。
Consumer con = (x) -> System.out.println(x);
等价于:
PrintStream ps = System.out;
Consumer con = ps::println;
2.调用参数的实例方法
使用类::实例方法
,等价于lambda的第一个参数调用该实例方法,lambda的其余参数为该实例方法的参数。
(x,y) -> x.equals(y);
等价于:
String::equals;
3.调用特定类的静态方法
(x,y) -> Integer.compare(x,y);
等价于:
Integer::compare;
4.构造器引用
注意调用的构造器是根据lambda的参数决定的。
Integer::new;
5.数组引用
数组的大小是由lambda的参数决定的。
(x) -> new String[x];
等价于:
String[]::new;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)