Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
1 package java8; 2 3 /** 4 * 使用 Lambda 表达式需要注意以下两点: 5 * Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在下面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。 6 * Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。 7 * 8 * // 1. 不需要参数,返回值为 5 9 * () -> 5 10 * 11 * // 2. 接收一个参数(数字类型),返回其2倍的值 12 * x -> 2 * x 13 * 14 * // 3. 接受2个参数(数字),并返回他们的差值 15 * (x, y) -> x – y 16 * 17 * // 4. 接收2个int型整数,返回他们的和 18 * (int x, int y) -> x + y 19 * 20 * // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) 21 * (String s) -> System.out.print(s) 22 */ 23 public class Java8Tester { 24 public static void main(String args[]){ 25 Java8Tester tester = new Java8Tester(); 26 27 // 类型声明 28 MathOperation addition = (int a, int b) -> a + b; 29 30 // 不用类型声明 31 MathOperation subtraction = (a, b) -> a - b; 32 33 // 大括号中的返回语句 34 MathOperation multiplication = (int a, int b) -> { return a * b; }; 35 36 // 没有大括号及返回语句 37 MathOperation division = (int a, int b) -> a / b; 38 39 System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); 40 System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); 41 System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); 42 System.out.println("10 / 5 = " + tester.operate(10, 5, division)); 43 44 // 不用括号 45 GreetingService greetService1 = message -> 46 System.out.println("Hello1 " + message); 47 48 // 用括号 49 GreetingService greetService2 = (message) -> 50 System.out.println("Hello2 " + message); 51 52 greetService1.sayMessage("Runoob"); 53 greetService2.sayMessage("Google"); 54 } 55 56 interface MathOperation { 57 int operation(int a, int b); 58 } 59 60 interface GreetingService { 61 void sayMessage(String message); 62 } 63 64 private int operate(int a, int b, MathOperation mathOperation){ 65 return mathOperation.operation(a, b); 66 } 67 }
结果:
1 10 + 5 = 15 2 10 - 5 = 5 3 10 x 5 = 50 4 10 / 5 = 2 5 Hello1 Runoob 6 Hello2 Google
例2:
1 package java8; 2 3 4 /** 5 * 1、lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义) 6 * 7 * 2、在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。 8 * 9 * String first = ""; 10 * Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错 11 */ 12 public class Java8Tester1 { 13 14 static int a = 3; 15 16 public static void main(String args[]) { 17 int num = 1; 18 Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num)); 19 // num = 4; 上一行 编译报错 Error:(7, 93) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量 20 // lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义) 21 s.convert(2); // 输出结果为 3 22 23 Converter<Integer, String> s1 = (param) -> System.out.println(String.valueOf(param + a)); 24 a = 5; 25 s1.convert(2); // 输出结果为 7 26 27 } 28 29 public interface Converter<T1, T2> { 30 void convert(int i); 31 } 32 }
结果:
3
7