Java Lambda 表达式
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示