函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
而我们要学习的Lambda表达式就是函数式思想的体现
格式:
(形式参数) -> {代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
->:由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
有一个接口
接口中有且仅有一个抽象方法
启动一个线程
实现方式一
实现步骤
定义一个类MyRunnable实现Runnable接口,重写run()方法
创建MyRunnable类的对象
创建Thread类的对象,把MyRunnable的对象作为构造参数传递
启动线程
public class myrunnable implements Runnable{
@Override
public void run() {
System.out.println("实现接口的方式");
}
}
public class myrunnabletest {
public static void main(String[] args) {
myrunnable my = new myrunnable();
Thread t1=new Thread(my);
t1.start(); //实现接口的方式
}
}
实现方式二
匿名内部类
public class myrunnabletest {
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类的方式");
}
});
t1.start(); //匿名内部类的方式
}
}
实现方式三
Lambda表达式
public class myrunnabletest {
public static void main(String[] args) {
Thread t1=new Thread(()->{
System.out.println("Lambda表达式");
}
);
t1.start(); //Lambda表达式
}
}
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public void fly() {
System.out.println("我会飞");
}
});
//3
useflyable(()->{
System.out.println("我会飞");
});
}
public static void useflyable(flyable f){
f.fly();
}
}
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public void fly(String name, String o) {
System.out.println("我是"+name+"会飞,飞的比"+o+"快");
}
});
//3
useflyable((String name,String o)->{
System.out.println("我是"+name+"会飞,飞的比"+o+"快");
});
}
public static void useflyable(flyable f){
f.fly("dyk","飞机");
}
}
public class flydemo {
public static void main(String[] args) {
//1
flyable f=new flyImpl();
useflyable(f);
//2
useflyable(new flyable() {
@Override
public int add(int a, int b) {
return a+b;
}
});
//3
useflyable((int a,int b)->{
return a+b;
});
}
public static void useflyable(flyable f){
int sum=f.add(1,2);
System.out.println("和为:"+sum);
}
}
参数类型可以省略。但是有多个参数的情况下,不能只省略一个
如果参数有且仅有一个,那么小括号可以省略
如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉
参数类型可以省略。但是有多个参数的情况下,不能只省略一个
public class flydemo {
public static void main(String[] args) {
//参数的类型可以省略
useflyable(( a,b)->{
return a+b;
});
}
public static void useflyable(flyable f){
int sum=f.add(1,2);
System.out.println("和为:"+sum);
}
}
如果只省略一个会报错
如果参数有且仅有一个,那么小括号可以省略
public class flydemo {
public static void main(String[] args) {
//如果参数有且仅有一个,那么小括号可以省略
useflyable(a->{
return a+2;
});
}
public static void useflyable(flyable f){
int sum=f.add(1);
System.out.println("和为:"+sum);
}
}
如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
public class flydemo {
public static void main(String[] args) {
//3
useflyable(a->a+2);
}
public static void useflyable(flyable f){
int sum=f.add(1);
System.out.println("和为:"+sum);
}
}
使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
必须有上下文环境,才能推导出Lambda对应的接口
根据局部变量的赋值得知Lambda对应的接口
Runnable r = () -> System.out.println("Lambda表达式");
根据调用方法的参数得知Lambda对应的接口
new Thread(() -> System.out.println("Lambda表达式")).start();
所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
使用限制不同
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
实现原理不同
匿名内部类:编译之后,产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成