引出:
创建一个线程,可以使用如下代码
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是一个线程");
}
}).start();
在上面代码中,new Thread()中的参数是Runnable(接口)类型的,接口不能直接new,但是可以使用匿名内部类的形式(上面代码中的new Runnable(){}...就是匿名内部类的写法);
Lambda表达式可以简化匿名内部类,让代码更简单。
匿名内部类转换为Lambda表达式的条件:
Runnable是一个接口,并且此接口下只有一个抽象方法(这种接口就叫做函数式接口),如图
怎么判断一个接口里的方法是不是抽象方法
接口里的方法有抽象方法和默认方法;其中,抽象方法不包含方法体并且不带修饰词default;
默认方法带有默认方法体并且由default修饰,这个接口的实现类可以不实现该方法也不会编译错误
比如Consumer类,红框的翻译是`这是一个函数式接口,它的抽象方法是accept`
Functional类也如此
满足上面圈出的两个条件,就可以把匿名内部类写法转换成Lambda表达式的写法,如下。
new Thread(() -> {
System.out.println("我是一个线程");
}).start();
匿名内部类转换为Lambda表达式的方法:
匿名内部类转换成Lambda表达式的过程很简单,只需要关注匿名内部类中的方法参数和方法体;
上面匿名内部类的方法参数为空,即为();
方法体为System.out.println("我是一个线程");
只需要把方法参数和方法体保留,其余的部分删除,最后再在方法参数和方法体中间加上->就实现了匿名内部类转换成Lambda表达式写法。
例子:
List<String> list = Arrays.asList("Java", "Python", "Go", "C++");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//使用Lambda表达式的方式:
List<String> list = Arrays.asList("Java", "Python", "Go", "C++");
list.forEach((String s) -> {
System.out.println(s);
});
//简写
list.forEach(s -> System.out.println(s));
Lambda表达式的省略规则:
左边
(1)形参列表类型可省
(2)形参只有一个时括号可省
右边
(1)只有一条执行语句,大括号、return关键字、分号可省(必须同时省略,这三个的话)
上面可以简写为
new Thread(() -> System.out.println("我是一个线程")).start();