当前位置: 首页 > news >正文

Java Lambda表达式入门教程

1. 什么是Lambda表达式?

Java 8 引入的 Lambda 表达式本质上是一个可以传递的匿名函数。它允许我们将函数作为参数传递给方法,或者将代码视为数据。Lambda 表达式极大地简化了函数式编程风格的代码编写,尤其是在集合操作、事件处理和并发编程等场景下,可以替代过去冗长的匿名内部类。

2. 函数式接口

在深入 Lambda 之前,必须先理解函数式接口。函数式接口是只包含一个抽象方法的接口(可以有多个默认方法或静态方法)。Lambda 表达式只能用于实现函数式接口。例如,我们定义两个接口:

// 无参数、无返回值的函数式接口interfaceDemo1{voidshow();}// 有参数、有返回值的函数式接口interfaceDemo2{intadd(inta,intb);}

两个接口都只声明了一个抽象方法,因此都是合法的函数式接口。Lambda 表达式就是这些抽象方法的实现。

3. Lambda 表达式语法

基本语法格式如下:

  • (parameters) -> expression
    当方法体只有一条语句且直接作为返回值时,可以省略大括号和return
  • (parameters) -> { statements; }
    当方法体包含多条语句,或需要显式书写return、抛出异常等时,必须使用大括号。

参数类型可以省略(由编译器根据上下文推断),如果只有一个参数且无类型,还可以省略小括号。但为了清晰,通常保留括号。

4. 实战:从匿名内部类到 Lambda

下面我们从一个完整的示例出发,逐步展示如何用 Lambda 表达式替代匿名内部类,并理解其运行过程。

4.1 传统匿名内部类写法(对比)

publicclassTraditionalDemo{publicstaticvoidrun1(Demo1d){d.show();}publicstaticvoidrun2(Demo2d){System.out.println(d.add(1,2));}publicstaticvoidmain(String[]args){// 匿名内部类实现 Demo1run1(newDemo1(){@Overridepublicvoidshow(){System.out.println("Hello Java");}});// 匿名内部类实现 Demo2run2(newDemo2(){@Overridepublicintadd(inta,intb){returna+b;}});}}

4.2 Lambda 表达式重构

使用 Lambda 表达式后,代码大幅精简:

// 函数式接口定义interfaceDemo1{voidshow();}interfaceDemo2{intadd(inta,intb);}publicclassLambdaDemo{publicstaticvoidrun1(Demo1d){d.show();// 调用对象的方法}publicstaticvoidrun2(Demo2d){System.out.println(d.add(1,2));}publicstaticvoidmain(String[]ages){// 1. 无参无返回值的 Lambdarun1(()->System.out.println("Hello Java"));// 2. 有参数有返回值的 Lambda(单条语句,省略 return 和大括号)run2((a,b)->a+b);// 3. 多行语句的 Lambda,必须使用大括号run1(()->{System.out.println("Hello");System.out.println("World");});}}

运行结果

Hello Java 3 Hello World

4.3 代码解读

  • () -> System.out.println("Hello Java")对应Demo1接口的void show()方法。小括号为空表示无参;箭头后面是只有一条语句的方法体。
  • (a, b) -> a + b对应Demo2接口的int add(int a, int b)。参数类型被自动推断为int;表达式a + b的值自动作为返回值,无需return关键字。
  • 当方法体超过一条语句时,必须用大括号包裹,每条语句末尾加分号,这与普通方法体写法一致。Lambda 在这里只是让代码更紧凑,但并未改变 Java 基本的代码块规则。

5. 常用函数式接口与进阶

Java 8 在java.util.function包中提供了一系列标准函数式接口,避免大家重复造轮子。常用四个:

接口抽象方法说明
Predicate<T>boolean test(T t)断言型,判断输入是否满足某条件
Consumer<T>void accept(T t)消费型,对输入执行某种操作,不返回结果
Function<T,R>R apply(T t)函数型,接收 T,返回 R
Supplier<T>T get()供给型,无参但返回一个结果

示例

importjava.util.function.*;publicclassFunctionalInterfaceDemo{publicstaticvoidmain(String[]args){// Predicate: 判断是否大于5Predicate<Integer>isGreaterThan5=x->x>5;System.out.println(isGreaterThan5.test(10));// true// Consumer: 打印字符串Consumer<String>printer=s->System.out.println("输出:"+s);printer.accept("Hello Lambda");// Function: 求字符串长度Function<String,Integer>lengthFunc=str->str.length();System.out.println(lengthFunc.apply("Hello"));// Supplier: 生成随机数Supplier<Double>randomSupplier=()->Math.random();System.out.println(randomSupplier.get());}}

方法引用简介

当 Lambda 体只是调用一个已经存在的方法时,可以进一步简化为方法引用,格式为类名::方法名对象::方法名

// Lambda 写法Consumer<String>printer1=s->System.out.println(s);// 方法引用Consumer<String>printer2=System.out::println;

方法引用使代码更加简洁易读,是 Lambda 的一种重要补充形式。

Lambda 表达式以函数式接口为基石,通过简洁的语法和丰富的标准接口,打开了 Java 函数式编程的大门。

语法优化

常见范式

实现基础

核心概念

Lambda 表达式

匿名函数

可传递的代码块

函数式接口

单一抽象方法

@FunctionalInterface

Predicate 断言型

Consumer 消费型

Function 函数型

Supplier 供给型

方法引用::


6. 总结

  • Lambda 表达式是 Java 8 中实现函数式接口的精简方式,本质是匿名函数。
  • 函数式接口有且只有一个抽象方法,是 Lambda 的载体。
  • 语法由参数列表、箭头、方法体组成,单条语句可省大括号和return
  • Java 标准库提供了PredicateConsumerFunctionSupplier等丰富的函数式接口,极大方便了流式操作与函数式编程。
  • 方法引用是 Lambda 的语法糖,当 Lambda 仅仅是调用一个已有方法时推荐使用。

掌握 Lambda 表达式将帮助你写出更简洁、优雅的 Java 代码,并为学习 Stream API、并行流等高级特性打下坚实基础。

http://www.jsqmd.com/news/1288369/

相关文章:

  • 数据治理服务平台整体规划文档
  • OpenRouter调用量榜大洗牌:小米MiMo-V2.5登顶全球第一,中国模型包揽前五
  • 网站日志分析SEO问题方法:僵尸页面筛查,节省70%抓取额度
  • NBTExplorer:3步掌握Minecraft数据编辑的核心能力
  • Arduino声控灯制作:从传感器原理到智能控制实践
  • 贵阳实体门店黄金回收靠谱吗?2026全新收金准则一文吃透 - 日常比对手册
  • 3步搞定Hackintosh!OpCore-Simplify让你的黑苹果配置简单到不可思议 [特殊字符]
  • LinkSwift:解锁九大网盘下载自由的专业级解决方案
  • 开源视频下载工具downkyi:技术回顾与数字内容管理思考
  • 7月29日热点:AI越狱事件引发行业安全反思
  • macOS免费防火墙终极指南:LuLu完整教程与配置技巧
  • 关于图论【卡码网110.字符串迁移的思考】
  • Technovation项目制学习:PBL框架如何培养女孩科技创业能力
  • AI 编译器生态对比:MLIR、XLA、TVM 与 Triton 的技术路线与社区活跃度
  • AI 员工也要“绩效考核“?企业管理 Agent 的未来图景
  • Python自动化批量下载与处理CHIRPS气象数据实战指南
  • 本地运行 OpenClaw 实操教程,自动化办公 AI 工具搭建方法(含安装包)
  • 天津geo优化公司哪家服务好?广拓时代谈GEO效果验收
  • 纳米3D打印技术解析:从原理到应用,探索微观制造新范式
  • 别把大模型 API Key 写进 APK:移动 AI 应用接口防盗刷实践
  • KMS_VL_ALL_AIO:Windows与Office智能激活技术深度解析
  • “四不两直”上门核查!天津市高新技术企业认定条件、批次安排、补贴政策汇总
  • Modbus_Rtu(半双工 )
  • 前端状态管理年度复盘:从「全局 Store」到「精细更新」的演进
  • AI 光伏逆变器智能功率 MOSFET 完整选型方案
  • 基于行空板K10的月相计算与可视化项目实践
  • 在线竞价采购平台有哪些?2026年主流电子招采平台选型参考
  • 如何在5分钟内免费为Windows 11 LTSC恢复完整的微软商店功能
  • Spring AI与Milvus构建企业级RAG架构实战
  • 2026 年来宾商铺工装屋面漏水,大面积防水包工包料全天候抢修,出具完整施工报价清单,飘窗、顶楼、地下室渗漏一站式施工。 - 防水百科