初学者的lambda
1、简介:
使用Lambda表达式可以让我们写出更短、更易读的代码。它可以替代传统的匿名类,使代码更加简洁。Lambda表达式还支持函数式编程,这意味着我们可以将函数作为参数传递给其他方法,使得代码更加灵活和可扩展。
2、基本语法
(parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
->:可理解为“被用于”的意思
方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回。
具体示例:
package langya.base.lambda; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @FunctionalInterface interface OneParameterReturn { int test(int a); } @FunctionalInterface interface MoreParameterReturn { int test(int a, int b); } @FunctionalInterface interface NoParameterReturn { int test(); } @FunctionalInterface interface OneParameterNoReturn { void test(int a); } @FunctionalInterface interface MoreParameterNoReturn { void test(int a, int b); } @FunctionalInterface interface NoParameterNoReturn { void test(); } @FunctionalInterface interface MyFunction { void printValue(); } public class Lambda { public void lambdaTest() { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); System.out.println("单个表达式的lambad"); numbers.forEach(number -> System.out.println(number)); List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)) ; System.out.println("为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。"); System.out.println("原始list:"+list); list.removeIf(n -> n % 2 == 0); System.out.println("修改后list:"+list); System.out.println("多个语句的lambad"); numbers.forEach(number -> { int dd = number * 2; System.out.println("number:" + number + " " + "dd:" + dd); }); System.out.println("有返回值一个参数的函数式接口"); OneParameterReturn oneParameterReturn = (int a) -> { System.out.println("有返回值有一个参数!"); a = a * 2; return a; }; int ret = oneParameterReturn.test(5); System.out.println(ret); System.out.println("有返回值多个参数的函数式接口"); MoreParameterReturn moreParameterReturn = (int a, int b) -> { System.out.println("有返回值多个参数!"); return a + b; }; int ret2 = moreParameterReturn.test(5, 2); System.out.println("a+b=" + ret2); System.out.println("无参数无返回值"); NoParameterReturn noParameterReturn = () -> { System.out.println("无参数无返回值"); return 1; }; int a = noParameterReturn.test(); System.out.println("a:" + a); System.out.println("一个参数无返回值的函数式接口"); OneParameterNoReturn oneParameterNoReturn = (int d) -> { System.out.println("一个参数无返回值的函数式接口,参数d的值为:" + d); }; oneParameterNoReturn.test(20); System.out.println("多个参数无返回值的函数式接口"); MoreParameterNoReturn moreParameterNoReturn = (int c, int b) -> { System.out.println("多个参数无返回值的函数式接口,参数c的值为:" + c + ",参数b的值为:" + b); }; moreParameterNoReturn.test(1, 2); System.out.println("无参无返回值"); NoParameterNoReturn noParameterNoReturn = () -> { System.out.println("无参无返回值"); }; noParameterNoReturn.test(); System.out.println("匿名内部类变量捕获"); final int x = 10; MyFunction myFunction = new MyFunction() { @Override public void printValue() { System.out.println("x:" + x); } }; myFunction.printValue(); } }
运行结果为:
单个表达式的lambad 1 2 3 4 5 6 7 8 为了能够让 Lambda 和 Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。 原始list:[1, 2, 3, 4, 5, 6, 7, 8] 修改后list:[1, 3, 5, 7] 多个语句的lambad number:1 dd:2 number:2 dd:4 number:3 dd:6 number:4 dd:8 number:5 dd:10 number:6 dd:12 number:7 dd:14 number:8 dd:16 有返回值一个参数的函数式接口 有返回值有一个参数! 10 有返回值多个参数的函数式接口 有返回值多个参数! a+b=7 无参数无返回值 无参数无返回值 a:1 一个参数无返回值的函数式接口 一个参数无返回值的函数式接口,参数d的值为:20 多个参数无返回值的函数式接口 多个参数无返回值的函数式接口,参数c的值为:1,参数b的值为:2 无参无返回值 无参无返回值 匿名内部类变量捕获 x:10
4、总结
Lambda 表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
优点:
- 代码简洁,开发迅速
- 方便函数式编程
- 非常容易进行并行计算
- Java 引入 Lambda,改善了集合操作
缺点:
- 代码可读性变差
- 在非并行计算中,很多计算未必有传统的 for 性能要高
- 不容易进行调试
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~