news 2026/7/29 17:02:37

Java Lambda表达式入门教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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、并行流等高级特性打下坚实基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 16:57:24

2026年Java面试高频考点与备战策略

1. 2026年Java面试全景解析最近整理了一份2026年最新的大厂Java面试题库&#xff0c;涵盖了1200道高频考点。这份资料特别适合准备"金三银四"跳槽季的开发者&#xff0c;从Java基础到分布式架构&#xff0c;从算法到系统设计&#xff0c;基本覆盖了所有技术栈的考察点…

作者头像 李华
网站建设 2026/7/29 16:56:42

凡科杰建云GEO产品介绍:AI搜索内容优化、价格、功能和适用企业

凡科杰建云GEO产品介绍&#xff1a;AI搜索内容优化、价格、功能和适用企业企业过去做官网&#xff0c;主要看搜索收录、TDK和表单。现在用户还会在AI搜索和问答工具里询问品牌、产品、价格和替代方案&#xff0c;公开内容如果不完整&#xff0c;品牌解释就容易变得不稳定。凡科…

作者头像 李华
网站建设 2026/7/29 16:55:17

茉莉花插件:如何用3步完成Zotero中文文献的智能管理?

茉莉花插件&#xff1a;如何用3步完成Zotero中文文献的智能管理&#xff1f; 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在…

作者头像 李华
网站建设 2026/7/29 16:53:31

基于 BERT+FAISS 的企业级智能客服系统部署与实战指南

随着自然语言处理技术的工程化落地,智能客服已成为企业降本增效的标配方案。本文基于开源项目 smart_customer_service,从零到一讲解一套完整的企业级智能客服系统的部署、使用、定制与优化全流程。该系统整合 BERT 意图识别、BERT-CRF 实体提取、Sentence-BERT+FAISS 向量检…

作者头像 李华
网站建设 2026/7/29 16:53:16

MatAnyone:如何用3行代码实现专业级AI视频抠像

MatAnyone&#xff1a;如何用3行代码实现专业级AI视频抠像 【免费下载链接】MatAnyone [CVPR 2025] MatAnyone: Stable Video Matting with Consistent Memory Propagation 项目地址: https://gitcode.com/gh_mirrors/ma/MatAnyone 还在为视频抠像的复杂流程和昂贵软件而…

作者头像 李华
网站建设 2026/7/29 16:53:08

创客马拉松实战指南:48小时极限硬件开发全流程解析

1. 项目概述&#xff1a;一场硬核创客的48小时极限挑战 如果你对硬件开发、开源硬件或者创客文化感兴趣&#xff0c;那么“创客马拉松”这个词对你来说一定不陌生。但“DFEdison创客马拉松”可能有些不同&#xff0c;它更像是一场专为“实干派”和“问题解决者”设计的、高强度…

作者头像 李华