DEV Community

[yun]
[yun]

Posted on • Updated on

Java 8 Lambda 表达式简介

Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它是 Java 8 中最重要新特性。

Java 中的 Lambda 表达式通常使用 (arguments) -> (expression) 语法书写。以下是lambda表达式的重要特征:

  • 可选参数:Lambda 表达式可以有零个或多个参数。
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

以下是一些 Lambda 表达式的例子:

 // 无argument,直接return值
 () -> "Andy"

 // 接收一个argurment, return一个计算值
 x -> 2 * x  

 // 接收2个arguments, return一个计算值  
 (int x, int y) -> { return x  y; }  

 // 接受一个string, 并println, 不return任何值  
 (String s) -> { System.out.println(s); }
Enter fullscreen mode Exit fullscreen mode

Lambda 表达式举例

 // 旧方法:
 new Thread(new Runnable() {
     @Override
     public void run() {
         System.out.println("Hello from thread");
     }
 }).start();

 // Lambda方法:
 new Thread( () -> System.out.println("Hello from thread") ).start();
Enter fullscreen mode Exit fullscreen mode

以下代码的作用是打印出给定数组中的所有元素。注意,使用 Lambda 的方法不止一种。在下面的例子中,我们先是用常用的箭头语法创建 Lambda,之后,使用 Java 8 全新的双冒号(::)操作符将一个常规方法转化为 Lambda:

 // 旧方法:
 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
 for(Integer n: list) {
    System.out.println(n);
 }

 // Lambda方法:
 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
 list.forEach(n -> System.out.println(n));


 // ::操作
 list.forEach(System.out::println);
Enter fullscreen mode Exit fullscreen mode

变量作用域

Lambda 只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

Top comments (0)