Lambda表达式
一、作用
替代一些 匿名类的定义和创建
二、好处
避免匿名内部类定义过多
去无意义代码,只写核心逻辑,使代码更简洁
三、定义函数式接口
定义只有一个抽象方法的接口,这叫函数式接口、SAM接口(Single Abstract Method interfaces)
public interface MyUtil {
String concat(String msg);
}
超过一个抽象方法的接口编译器无法推导,因为编译器不知道你要实现的是哪个接口。
但是可以有非抽象方法,比如:default方法
public interface MyUtil {
String concat(String msg);
default void 默认实现方法(){
System.out.println("默认实现方法");
}
}
@FunctionalInterface
作用:让编译器检查接口是否是函数式接口,不是则编译出错。
@FunctionalInterface
public interface MyUtil {
String concat(String msg);
}
JDK自带函数式接口,比如:Runable 、Consumer、Supplier、Function、Predicate
四、创建 和 调用
使用lambda表达式-> 创建匿名函数类实例
编译器无法知道你使用什么接口,所以需要声明变量去接收,编译器才能自动推导匿名类类型
接口 实例对象 = (形参) -> { 接口代码实现 }
MyUtil m = (String msg) -> {
System.out.println("打印A");
return "打印".concat(msg);
}
//调用
System.out.println( m.concat("信息") );
//结果:打印信息
形参可以不用加类型,因为类型已经在接口定义好了,编译器知道形参类型
MyUtil m = (msg) -> { return "打印".concat(msg); }
如果只有一行代码可省去大括号;并且如果有返回值可省去return
MyUtil m = (msg) -> "打印".concat(msg);
如果只有一个形参,省去小括号
MyUtil m = msg -> "打印".concat(msg);
形参名可以与接口定义形参名不一样
MyUtil m = s -> "打印".concat(s);
作为方法参数,因为方法参数已定义,编译器可自动推导匿名类类型
public class 调用器 {
public static void 调用 ( MyUtil m , String msg) {
System.out.println( m.concat(msg) );
}
}
调用器.调用( s -> "打印".concat(s) , "调用器信息" );
//结果: 打印调用器信息
五、方法引用
符号:::
作用:普通类/对象返回方法的函数式接口实例 (包括构造器)
使用:
//以下是一个普通类定义
public class Person {
public static void description(){
System.out.println("这是人类");
}
private String name;
public void setName(String name){
this.name = name;
System.out.println("已取名:" + name);
}
public void run2(String msg){
System.out.println( name + "在跑,并叫喊:" + msg);
}
}
函数式接口实例 = 类::静态方法
Runnable r = Person::description;
r.run();
//这是人类
函数式接口实例 = 类::new
Supplier<Person> supplier = Person::new;
Person p = supplier.get();
函数式接口实例 = 实例::实例方法
Consumer<String> c = p::setName;
c.accept("泰男啦");
//打印:已取名:泰男啦
Consumer<String> c2 = p::run2;
c2.accept("太难啦");
//打印:泰男啦在跑,并叫喊:太难啦
选用函数式接口,只要形参和返回值 与 定义的方法符合,该接口就可以使用
六、JDK自带的函数式接口
四大函数式接口
函数式接口 | 类型 | 返回 |
---|---|---|
Consumer | T | void |
Supplier | 无 | T |
Function<T, R> | T | R |
Predicate | T | boolean |
其他函数式接口
函数式接口 | 参数类型 | 返回类型 | 函数式接口 | 参数类型 | 返回类型 |
---|---|---|---|---|---|
UnaryOperator | T | T | ToIntFunction | T | int |
BinaryOperator | T、T | T | ToLongFunction | T | long |
BiConsumer<T,U> | T、U | void | ToDoubleFunction | T | double |
BiFunction<T,U,R> | T、U | R | IntFunction | int | R |
BiSupplier | 无 | T | LongFunction | long | R |
BiPredicate | T | boolean | DoubleFunction | double | R |
Runable | 无 | 无 | 等等… |