Lambda表达式
使用前提和标准格式
- Lambda表达式的使用前提
- 有一个接口
- 接口中有且仅有一个抽象方法(
单接口
)
- 格式:
(形式参数)->
{代码块}- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
->
:由英文中画线和大于符号组成,固定写法。代表指向动作- 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
- 组成Lambda表达式的三要素:
形式参数
,箭头
,代码块
public class example_2 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是用了内部类");
}
}).start();
new Thread(() -> {
System.out.println("我是用了lambda表达式");
}).start();
}
}
省略模式
- 省略的规则
参数类型
可以省略
。但是有多个参数的情况下,不能只省略一个- 如果
参数有且仅有一个
,那么小括号可以省略
- 如果代码块的
语句只有一条
,可以省略大括号和分号,和return关键字
注意事项
- 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
- 必须有上下文环境,才能推导出Lambda对应的接口
- 根据局部变量的赋值得知Lambda对应的接口
Runnable r = () -> System.out.println(“Lambda表达式”); - 根据调用方法的参数得知Lambda对应的接口
new Thread(() -> System.out.println(“Lambda表达式”)).start();
- 根据局部变量的赋值得知Lambda对应的接口
表达式和匿名内部类的区别
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
接口组成与更新
接口中默认方法
Java8开始允许接口有默认方法
- 格式:
- public default 返回值类型 方法名(参数列表){ }
interface myInterface {
int show(int x, int y);
default void pose() {
System.out.println("我是默认方法");
}
}
- 注意事项
- 默认方法不是抽象方法,所以
不强制被重写
。但是可以被重写,重写的时候去掉default关键字 public可以省略,default不能省略
- 默认方法不是抽象方法,所以
接口中的静态方法
同样Java8也允许接口有静态方法
- 格式:
- public static 返回值类型 方法名(参数列表) { }
interface myInterface {
int show(int x, int y);
static void pose() {
System.out.println("我是默认方法");
}
}
- 注意事项
- 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
- public可以省略,static不能省略
接口中的私有方法
-
私有方法产生原因
Java 9中新增了带方法体的私有方法:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时
,程序必然考虑将这段实现代码抽取成一个共性方法
,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性 -
格式1:
- private 返回值类型 方法名(参数列表) { }
-
格式2:
- private static 返回值类型 方法名(参数列表) { }
interface myInterface {
int show(int x, int y);
default void pose() {
System.out.println("我是默认方法");
method();
}
private static void method(){
System.out.println("我是多余的");
}
}
注意事项
默认方法
可以调用私有的静态
方法和非静态
方法静态方法
只能调用私有的静态
方法
CET4P231
- intimate
- concede
- creature
- sequence
- probable
- nucleus
- optional
- financial
- fuss
- bacon
- defeat
- defeat
- wax