Java条记:Lambda表达式

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

Lambda表达式在Java中是函数式编程的一种表现,答应把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。
1. 语法和基础使用

语法:
  1. // Lambda实现是一个简单的表达式
  2. (parameters) -> expression;
  3. // Lambda实现是一个函数体
  4. (parameters) -> {statements;}
复制代码

  • parameters是参数列表,如果没有参数,则须要使用一个空括号 () -> ... 。
  • 如果只有一个参数,则可以不用括号 parameter -> ... (推荐),也可以使用括号 (parameter) -> ... 。
  • 如果有多个参数,则正常使用参数列表即可 (parameter1, parameter2, ...) -> ... 。
  • 由于java中对于Lambda表达式的范例推断机制,其中的parameter可以声明参数范例,也可以不用,如 (int parameter) -> ... 。
示例1:只有一个参数,函数主体是简单表达式。
  1. List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
  2. // 单参数 + 简单表达式,也是将Lambda表达式作为函数传递给方法
  3. names.forEach(name -> System.out.println(name));
复制代码
示例2:使用Lambda表达式实现函数式接口,并作为参数传入方法。
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         // 使用Lambda表达式实现接口
  4.         AddOperation addOperation = (a, b) -> System.out.println(a + b);
  5.         // 执行对应的接口方法
  6.         addOperation.operate(1, 2);
  7.         // 将Lambda表达式作为参数传入方法
  8.         Main.add_operate(3, 4, addOperation);
  9.     }
  10.     /**
  11.      * 定义一个接口
  12.      */
  13.     interface AddOperation {
  14.         void operate(int a, int b);
  15.     }
  16.     /**
  17.      * 将接口作为参数类型
  18.      */
  19.     public static void add_operate(int a, int b, AddOperation addOperation) {
  20.         addOperation.operate(a, b);
  21.     }
  22. }
复制代码
函数式接口: 能用Lambda表达式实现的接口必须是函数式接口,即内部只有一个抽象方法的接口。可以使用注解@FunctionalInterface来标识该接口,如果该接口不满足函数式接口的定义则会报错,例如接口中有两个抽象方法。
2. 变量作用域

Lambda表达式中使用的局部变量,是隐式的final范例,即不可以在表达式后再修改该变量的值。以下示例会报编译错误:
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         int b = 1;
  4.         // b为隐式的final类型,不允许在Lambda后面再修改b的值
  5.         // 此处IDE会提示:variable used in lambda expression should be final or effectively final
  6.         AddOperation addOperation = a -> System.out.println(a + b);
  7.         b = 3;
  8.         addOperation.operate(2);
  9.     }
  10.     /**
  11.      * 定义一个接口
  12.      */
  13.     interface AddOperation {
  14.         void operate(int a);
  15.     }
  16. }
复制代码
Lambda表达式中的参数定义也不能和局部变量的参数名称同名,以下示例会报编译错误:
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         int b = 1;
  4.         int c = 2;
  5.         // 此处Lambda表示的参数b和局部变量的名称相同,编译会报错
  6.         // IDE也会提示:Variable 'b' is already defined in the scope
  7.         AddOperation addOperation = b -> System.out.println(b + c);
  8.         addOperation.operate(2);
  9.     }
  10.     /**
  11.      * 定义一个接口
  12.      */
  13.     interface AddOperation {
  14.         void operate(int a);
  15.     }
  16. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表