lambda的前提:-----》有一个接口,并且有且只有一个抽象方法
1、函数式编程思想
考虑要做什么,而不是怎么做
2、初体验
实现:启动一个线程,控制台输出,线程启动了。。。
·~:定义一个类myrunnable实现runnable接口,重写run方法;
创建myrunnable类对象
创建thread类对象,把myrunnable的对象作为构造参数传递
启动线程
MyRunnable my=new MyRunnable();
Thread thread = new Thread(my);
thread.start();
·~:匿名内部类的方法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类的方法 ");
}
}).start();
·~:lambda的方法
new Thread(()->{
System.out.println(" hhhhh " );
}).start();
3、lambda的标准格式
从匿名内部类中,看出重写run方法。
·~:方法形式为空,说明调用方法不需要传递参数
·~:方法返回值类型为void,说明没有方法返回。
·~:方法体的内容,是具体要做的事情。
lambda表达式:()为空,可以当作方法形式参数为空 -》:指向要做的事情 {}包含代码块,可以当作方法体中的内容。
格式:(形式参数)->{代码块}
useAddable((int x,int y)->{
return x+y;
});
参数类型可以省略,但是多个参数的情况下,不能只省略一个。如果参数有且仅有一个,那么小括号可以省。如果代码块的语句只有一句,可以省略大括号和分号。
如果有return,那么return也要省略。。
useAddable((x, y)->{
return x+y;
});useAddable(x->{
return x;
});
useAddable(x->x);
注意:::::
1、使用lambda必须有接口,并且要求接口中有且仅有一个抽象方法
2、必须有上下文环境,才能推到出lambda对应的接口
根据局部变量的赋值得知lambda对应的接口:Runnbler=()-》system.out.printly('lambda')
根据调用方法的参数得知lambda对应的接口:new thred(()-》system.out.printly('lambda').start();
匿名内部类和lambda的区别
所需类型不同:
·~:匿名内部类,可以是接口,也可以是抽象类,还可以是具体类
·~:只能是接口
使用限制不同
·~:如果接口中有且仅有一个抽象方法,可以使用lambda,也可以匿名内部类
·~:接口多于1个,就只能匿名内部类,不能lambda表达式。。