简介
lambda表达式可以让代码更加简洁,易于阅读和维护
基本结构f ->{ }
lambda表达式在功能上等同于一个匿名方法
类型识别
f变量的类型是系统自识别的,所以Lambda表达式要配合上下文,和其他方法配合使用,而不是一个独立的语句
无类型参数使用
public void print(f) {
System.out.println(f.getName());
}
举个例子
List<Animal> animals = Arrays.asList(
new Animal("Wolf"),
new Animal("Dog"),
new Animal("Cat"),
new Animal("Cattle"),
new Animal("Chicken")
);
遍历打印动物名字:
for (int i = 0; i < animals.size(); i++) {
Animal a = animals.get(i);
System.out.println(a.getName());
}
如果使用Lambda:
animals.forEach(f->{
System.out.println(f.getName());
});
代码明显简洁的多看一下演示图片发现没有区别
多参数:
箭头前表示参数变量,多个参数时必须要用小括号包括:
(a,b) -> { }
无参数
() -> {}
单条执行语句:
箭头后执行的语句只有一条时,可以不加{ }
s -> System.out.println(s);
有类型参数使用
animals.forEach((Animal a) -> {
System.out.println(a.getName());
});
引用外部变量
Lambda表达式{ }内执行的代码还可以引用外部的变量
规范一:
引用的局部变量不允许被修改,即使写在表达式后面也不行,因为Lambda表达式引用的局部变量具备final的特性,初始化后不允许被修改
规范二:
参数不能与局部变量同名
双冒号操作符
举个栗子
List<String> names = Arrays.asList("zhangSan", "LiSi", "WangWu");
names.forEach(n -> {
System.out.println(n);
});
简化后
names.forEach(System.out::println);
System.out::println
等同于n -> {System.out.println(n);}
不同用法
一.静态方法调用
假设print()方法标识为static
则使用LambdaTest::print
代替f -> LambdaTest.print(f)
二.非静态方法调用
需要实例对象来调用
animals.forEach(new LambdaTest()::print);