1.Lamda表达式的作用
一句话:代替匿名内部类,使代码变的更加简洁,被匿名内部类实现的接口中有且仅有一个抽象方法
2.Lamda表达式的基本语法
->左边是参数,右边是表达式
(parameters) -> expression
或
(parameters) ->{ statements; }
注:
- 参数类型可写可省略,当省略时,编译器自动识别参数类型。
- 当只有一个参数时,参数可不加括号,当没有参数或者多个参数时需要加括号
- 当只有一个表达式时,可不加花括号
3.举个例子
使用匿名内部类创建子线程
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("!!!!!");
}
}).start();
}
使用Lamda表达式创建子线程
public static void main(String[] args) {
new Thread(()-> System.out.println("!!!")).start();
}
可这样简单理解:匿名内部类实现的接口中有一个抽象方法,->右边就是重写该抽象方法的方法体,而->左侧()内是抽象方法的实际参数。可见,使用Lamda表达式能减少代码量。
4.使用Lamda表达式遍历List集合
使用增强for循环遍历List集合
public static void main(String[] args) {
List<String> languages = Arrays.asList("java","scala","python");
for (String language : languages) {
System.out.println(language);
}
}
使用forEach方法遍历List集合
public static void main(String[] args) {
List<String> languages = Arrays.asList("java","scala","python");
languages.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
}
从上述代码中可以看出,forEach()
的参数是一个Consumer<T>
接口的实现类,此处用匿名内部类的方式实现,该接口中有一个抽象方法为accept()
,查看forEach()
的源码,其底层也是一个增强for循环。从匿名内部类中可以看到,抽象方法的参数是s
,方法体为System.out.println(s);
,则改为Lamda表达式的形式:
public static void main(String[] args) {
List<String> languages = Arrays.asList("java","scala","python");
languages.forEach(s -> System.out.println(s));
}
真简洁!