lambda表达式可以干什么呢?
创建可以在将来某个时间点执行的代码块
了解lambda之间,先知道什么是函数式接口
函数式接口,顾名思义,它是一个接口,它还有个特点,就是只有一个抽象方法
java需要这种接口的对象时,就可以通过lambda表达式来构造
也就是说lambda表达式可以用来构造只有一个抽象方法的接口
函数式接口的特点:只有一个抽象方法 ,所以我们只关注它的参数类型,参数个数和返回值,这个抽象方法起什么名字 ,好像并不是那么不重要
现在我们来创建一个函数式接口,这个接口用来打印某些东西
public class LambdaDemo1 {
interface Printer{ //我们创建的函数式接口
void print(String val) ;
}
public void printSome(String name , Printer printer){
printer.print(name); //使用这个函数来实现接口里的方法
}
}
我们现在在main方法中实现这个接口
public static void main(String[] args) {
LambdaDemo1 lambdaDemo1 = new LambdaDemo1();
Printer printer = new Printer() { //实现接口的具体过程
@Override
public void print(String val) {
System.out.println(val); //就是输出你输入的值
}
};
lambdaDemo1.printSome("asdasd",printer); //打印输入的值
}
现在我们通过lambda表达式简化实现接口的具体过程
//格式() -> {}
//{}里面为实现的方法,如果代码只有一行可以省略
Printer printer1 = (String name) -> System.out.println(name);
可以看到这里我们只关注参数类型,参数个数和具体实现的过程,之前的print这个方法名对电脑来说好像没有什么帮助
如果你只有一个参数,那么可以更加的简化,()和String都被省略了
Printer printer2 = name-> System.out.println(name) ;
现在,我们再再进行进一步的简化
Printer printer3 = System.out::println;
System.out::println
是一个方法引用
::
运算符分割对象或类名与方法名
我们看到这下连name 都省略了,是不是很神奇呢?
我们按ctrl+println看看它的源码 如下图,有很多重载的方法
为什么可以省略呢? 因为java的编译器可以根据上下文确定使用的哪一个方法
所以,最终简化版本可以这样写
lambdaDemo1.printSome("asdasd",System.out::println);
总代码
public class LambdaDemo1 {
interface Printer{ //我们创建的函数式接口
void print(String val) ;
}
public void printSome(String name , Printer printer){
printer.print(name); //使用这个函数来实现接口里的方法
}
public static void main(String[] args) {
LambdaDemo1 lambdaDemo1 = new LambdaDemo1();
Printer printer = new Printer() { //实现接口的具体过程
@Override
public void print(String val) {
System.out.println(val); //就是输出你输入的值
}
};
lambdaDemo1.printSome("asdasd",printer); //打印输入的值
Printer printer1 = (String name) -> System.out.println(name);
Printer printer2 = name-> System.out.println(name) ;
Printer printer3 = System.out::println;
lambdaDemo1.printSome("asdasd",printer1);
lambdaDemo1.printSome("asdasd",printer2);
lambdaDemo1.printSome("asdasd",printer3);
lambdaDemo1.printSome("asdasd",System.out::println);
}
}