Lambda表达式
Lambda表达式
-
Lambda表达式:特殊的匿名内部类,语法更简洁
-
Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传 递),将代码像数据一样传递。
-
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> { //方法体 };
-
Lambda引入了新的操作符:
->
(箭头操作符),->
将表达式分成两部分• 左侧:(参数1,参数2…)表示参数列表
• 右侧:{}内部是方法体
-
注意事项:
• 形参列表的数据类型会自动推断。
• 如果形参列表为空,只需保留() 。
• 如果形参只有1个,()可以省略,只需要参数的名称即可。
• 如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则 必须同时省略return,且执行语句也保证只有一句。
• Lambda不会生成一个单独的内部类文件。
函数式接口
- 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口 可以使用
Lambda
表达式,Lambda
表达式会被匹配到这个抽象方法上 。 @FunctionalInterface
注解可以检测接口是否符合函数式接口。
示例:
-
//接口 @FunctionalInterface public interface Usb { void service(); }
-
//实现 public class Demo { public static void main(String[] args) { Usb mouse = new Usb() { @Override public void service() { System.out.println("鼠标开始工作了..."); } }; Usb fan = () -> System.out.println("风扇开始工作了..."); run(mouse); run(fan); } public static void run(Usb usb) { usb.service(); } }
方法引用
-
方法引用是Lambda表达式的一种简写形式。 如果Lambda表达式方法体中 只是调用一个特定的已经存在的方法,则可以使用方法引用。
-
常见形式
• 对象::实例方法
• 类::静态方法
• 类::实例方法
• 类::new
public class Demo {
public static void main(String[] args) {
//1 对象::实例方法
Consumer<String> consumer=s->System.out.println(s);
consumer.accept("hello");
Consumer<String> consumer2=System.out::println;
consumer.accept("world");
//2类::静态方法
Comparator<Integer> com=(o1,o2)->Integer.compare(o1, o2);
Comparator<Integer> com2=Integer::compare;
//3类::实例方法
Function<Employee, String> function=e->e.getName();
Function<Employee, String> function2=Employee::getName;
System.out.println(function2.apply(new Employee("小明", 50000)));
//4类::new
Supplier<Employee> supplier=()->new Employee();
Supplier<Employee> supplier2=Employee::new;
Employee employee=supplier.get();
System.out.println(employee.toString());
}
}