lambda表达式通俗的讲可以理解为匿名函数,它没有访问修饰符、返回值以及声明方法。它只能用于函数式接口
函数式接口
只包含一个抽象方法的接口。在判断是否为函数式接口的时候要排除Object里面的方法,如toString这些。
java中的函数式接口都在java.util.function
中。可以自定义函数式接口使用lambda,在自定义的时候在接口上加上@FunctionalInterface 注解,该注解由编译器检查。因此,如果该接口不是仅仅只包含一个抽象方法,那么就会出现编译错误。
1 | //这是函数式接口 |
主要特性
一个参数无需圆括号,多个参数需要圆括号,没有参数需要圆括号
无需声明参数类型,编译器自动识别
如果主体只有一个语句,不需要大括号
如果主体只有一个返回值,不需要return就自动返回
1
2
3e -> e*2;
(e1,e2) -> e1+e2;
() -> 5lambda内部可以访问外部的静态、非静态和局部变量
lambda只能引用final标记的变量,也就是不能在lambda内部修改定义在域外的变量
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
1
2String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错
Lambda常用的地方
Runnable
1 | new Thread( () -> System.out.println("Lambda expression") ).start(); |
ActionListener
1 | JButton show = new JButton("Show"); |
集合遍历
1 | List features = Arrays.asList("Lambdas", "Method", "API", "Date"); |