Lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。使用Lambda表达式的重点是延迟执行 (deferred execution )。
语法 1 2 3 (Type param1,Type param2,Type param3) -> { }
参数类型可以省略,编译器可以根据上下文推导;但并不是所有类型都能推导出来,有时需要声明参数类型;
当参数只有一个时,小/圆括号可以省略;
当主体只有一条语句时,大括号可以省略;
当主体只有一条语句时,return可以省略;
实例 参考自runoob.com 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 public class Java8Test { public static void main (String[] args) { Java8Test test = new Java8Test (); MathOperation addition = (int a, int b) -> a + b; MathOperation subtraction = (a, b) -> a - b; MathOperation multiplication = (a, b) -> { return a * b; }; MathOperation division = (int a, int b) -> a / b; System.out.println("10+5=" + test.operate(10 , 5 , addition)); System.out.println("10-5=" + test.operate(10 , 5 , subtraction)); System.out.println("10*b=" + test.operate(10 , 5 , multiplication)); System.out.println("10/5=" + test.operate(10 , 5 , division)); GreetingService greetingService1 = message -> System.out.println("Hello" + message); GreetingService greetingService2 = (message) -> System.out.println("Hello" + message); greetingService1.sayMessage("World" ); greetingService2.sayMessage("Lambda" ); } interface MathOperation { int operation (int a, int b) ; } @FunctionalInterface interface GreetingService { void sayMessage (String message) ; @Override String toString () ; } private int operate (int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
上面的实例中,将MathOperation接口(函数)做为参数传递给operate方法,返回的也是一个方法(函数),这在java 8 之前是无法做到的。这也是java 8的另一新特性,函数式编程;支持函数式编程的语言有很多,如Python、JavaScript等。
在java中Lambda表达式是对象,它必须依附于一类特别的对象类型——函数式接口(Functional Interface)
函数式接口的定义:如果一个接口中,有且只有一个抽象的方法(Object类中的方法不包括在内),那这个接口就可以被看做是函数式接口。
回到上面的实例中,MathOperation接口与GreetingService接口都是函数式接口,其中GreetingService内重写了Object类的toString方法,注解@FunctionalInterface用于声明该接口为函数式接口,如果某个接口(如MathOperation)满足函数式接口定义,编译器也会认为这是一个函数式接口;函数式接口内的方法不可以重载;
变量作用域
Lambda 表达式只能引用声明为final的外层局部变量。
Lambda 表达式中使用局部变量时,该局部变量可以不用声明为final,但是必须不可被后面的代码修改(即隐性的具有final的语义)。
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
在 Lambda 表达式中使用this关键字时,是指创建这个Lambda表达式的方法的this参数。