Lambda表达式的介绍
Lambda表达式是 JDK8最重要的新功能之一。使用 Lambda 表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、 遍历、过滤数据的操作。Lambda表达式使用函数式编程,参数类型自动推断,代码量少,lambda表达式可以用于任何有函数式接口的地方。
使用案例:
public class Test {
public static void main(String[] args) {
//匿名内部类方式
new Thread(new Runnable() {
@override
public void run() {
System.out.println("run.. ........" );
}
}).start();
//Lambda表达式方式
new Thread(()->{System.out.println("run........"); }).start();
}
}
函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。一些自带的函数式接口如下。
Supplier 代表一个输出
Consumer 代表一个输入
BiConsumer 代表两个输入
Function 代表一个输入,一个输出(一般输入和输出是不同类型的)
UnaryOperator 代表一个输入,一个输出(输入和输出是相同类型的)
BiFunction 代表两个输入,一个输出(一般输入和输出是不同类型的)
BinaryOperator 代表两个输入,一个输出(输入和输出是相同类型的)
lambda表达式会自动推断类型,如果要自定义函数式接口,需要在接口中添加@FunctionalInterface注解
方法的引用
方法引用是用来直接访问类或者实例的已经存在的方法或者构造 方法,方法引用提供了一种引用而不执行方法的方式,如果抽象 方法的实现恰好可以使用调用另外一个方法来实现,就有可能可 以使用方法引用。
方法引用分为静态方法引用、实例方法引用、对象方法引用、构造方法引用。如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用,通过调用一个实 例的实例方法来实现,那么就可以使用实例方法引用,可以通过调用一个类 的构造方法来实现,那么就可以使用构造方法引用。抽象方法的第一个参数类型刚好是实例方法的类 型,抽象方法剩余的参数恰好可以当做实例方法的参数。如果函 数式接口的实现能由上面说的实例方法调用来实现的话,那么就 可以使用对象方法引用。
Function<String,String >f1=(str)->str.toUpperCase();
Function<String ,String >f2=(str)-> Test2.toUpperCase(str);
//静态方法引用
Function<String ,String >f3=Test2::toUpperCase;
Function<String ,String >f4=Fun::toUpperCase;
System.out.println(f1.apply("abc"));
System.out.println(f2.apply("abc"));
System.out.println(f3.apply("abc"));
System.out.println(f4.apply("abc"));
//实例方法引用
Supplier<String> s1 = ()->new Test3().put();
Supplier<String> s2 = ()->{return new Test3().put();};
Supplier<String> s3 = new Test3()::put;
//对象方法引用
Consumer<Too>c1=(too)->new Too().foo();
c1.accept(new Too());
Consumer<Too>c2=(Too too)->new Too2().foo();
c2.accept(new Too());