函数式编程思想
函数是有输入,有输出的额一个过程,面向对象思想强调的是一切必须通过对象的形式来做事情,
函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式去做,
lambda表达式就是函数式编程思想的体现
Lambda初体验
需求:启动一个线程,输出一句话
public class Test {
public static void main(String[] args) {
//实现类的方式
//MyRunnable myRunnable = new MyRunnable();
//Thread t = new Thread(myRunnable);
//t.start()
//匿名内部类的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多线程启动啦!");
}
}).start();
//lambda方式改造
new Thread( ()-> {
System.out.println("多线程启动啦!");
}).start();
}
}
lambda方式分析:
- ()里面没内容,可以看作方法形参为空
- ->用箭头指向后面要做的事
- { }包含一段代码,称之为代码块,可以看成方法体中的内容
Lambda表达式标准格式
格式:(形参)->{代码块}
如果有多个形参就用逗号分开,没有为空即可
Lambda表达式使用前提
- 有一个接口
- 接口中
有且只有一个抽象方法
Lambda表达式练习
Addable是一个接口,其中有add这个方法,执行完控制台输出了30,
执行lambda表达式的时候,系统偷偷的自动创建了一个对象,lambda实现了add方法
lambda表达式的结果其实就是一个实现了接口的对象,这也解释了传的参数应该是Addable的实现对象
public class Test {
public static void main(String[] args) {
useAddable( (int x,int y)-> {
return x+y;
});
}
private static void useAddable(Addable a) {//传的肯定是Addable的实现对象,所以可以调用
int sum = a.add(10,20);
System.out.println(sum);
}
}
省略模式
- 参数类型可以省略,但是不能只省略一个,要省略全省略
- 如果参数有且仅有一个,小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,如果有return也要把return省略
Lambda表达式与匿名内部类的区别
# 所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
# 使用限制不同
如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类
如果接口有多个抽象方法,只能使用匿名内部类,不能使用lambda表达式
# 实现原理不同
匿名内部类:编译以后产生一个单独的.class字节码文件
Lambda表达式:编译之后没有一个单独的.class字节码文件,对应的字节码会在运行时动态生成