Lambda表达式在Java中是函数式编程的一种表现,答应把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。
1. 语法和基础使用
语法:- // Lambda实现是一个简单的表达式
- (parameters) -> expression;
- // Lambda实现是一个函数体
- (parameters) -> {statements;}
复制代码
- parameters是参数列表,如果没有参数,则须要使用一个空括号 () -> ... 。
- 如果只有一个参数,则可以不用括号 parameter -> ... (推荐),也可以使用括号 (parameter) -> ... 。
- 如果有多个参数,则正常使用参数列表即可 (parameter1, parameter2, ...) -> ... 。
- 由于java中对于Lambda表达式的范例推断机制,其中的parameter可以声明参数范例,也可以不用,如 (int parameter) -> ... 。
示例1:只有一个参数,函数主体是简单表达式。- List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
- // 单参数 + 简单表达式,也是将Lambda表达式作为函数传递给方法
- names.forEach(name -> System.out.println(name));
复制代码 示例2:使用Lambda表达式实现函数式接口,并作为参数传入方法。- public class Main {
- public static void main(String[] args) {
- // 使用Lambda表达式实现接口
- AddOperation addOperation = (a, b) -> System.out.println(a + b);
- // 执行对应的接口方法
- addOperation.operate(1, 2);
- // 将Lambda表达式作为参数传入方法
- Main.add_operate(3, 4, addOperation);
- }
- /**
- * 定义一个接口
- */
- interface AddOperation {
- void operate(int a, int b);
- }
- /**
- * 将接口作为参数类型
- */
- public static void add_operate(int a, int b, AddOperation addOperation) {
- addOperation.operate(a, b);
- }
- }
复制代码函数式接口: 能用Lambda表达式实现的接口必须是函数式接口,即内部只有一个抽象方法的接口。可以使用注解@FunctionalInterface来标识该接口,如果该接口不满足函数式接口的定义则会报错,例如接口中有两个抽象方法。
2. 变量作用域
Lambda表达式中使用的局部变量,是隐式的final范例,即不可以在表达式后再修改该变量的值。以下示例会报编译错误:- public class Main {
- public static void main(String[] args) {
- int b = 1;
- // b为隐式的final类型,不允许在Lambda后面再修改b的值
- // 此处IDE会提示:variable used in lambda expression should be final or effectively final
- AddOperation addOperation = a -> System.out.println(a + b);
- b = 3;
- addOperation.operate(2);
- }
- /**
- * 定义一个接口
- */
- interface AddOperation {
- void operate(int a);
- }
- }
复制代码 Lambda表达式中的参数定义也不能和局部变量的参数名称同名,以下示例会报编译错误:- public class Main {
- public static void main(String[] args) {
- int b = 1;
- int c = 2;
- // 此处Lambda表示的参数b和局部变量的名称相同,编译会报错
- // IDE也会提示:Variable 'b' is already defined in the scope
- AddOperation addOperation = b -> System.out.println(b + c);
- addOperation.operate(2);
- }
- /**
- * 定义一个接口
- */
- interface AddOperation {
- void operate(int a);
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |