《Java零基础教学》是一套深入浅出的 Java 编程入门教程。全套教程从Java基础语法开始,适合初学者快速入门,同时也从实例的角度进行了深入浅出的讲解,让初学者能够更好地理解Java编程思想和应用。
本教程内容包括数据类型与运算、流程控制、数组、函数、面向对象基础、字符串、集合、异常处理、IO 流及多线程等 Java 编程基础知识,并提供丰富的实例和练习,帮助读者巩固所学知识。本教程不仅适合初学者学习,也适合已经掌握一定 Java 基础的读者进行查漏补缺。
前言
大家好,我是不熬夜崽崽。作为一名 Java 后端研发,今天想跟大家聊的是一个老生常谈的话题,不知大家有没有过这样的经历,写代码的时候你总觉得代码中充斥着一堆匿名类,代码看上去比搞笑片还要复杂?尤其是在 Java 中,匿名类总能让你头疼不已。你是不是也觉得,这些冗长的匿名类代码就像是一个个"死结",越绕越复杂,最后让你深陷其中,无法自拔?
如果你有过类似的经历,那么你是时候认识 Java 中的一个绝招了------Lambda 表达式。它将彻底改变你与代码打交道的方式,让你享受编程的乐趣,告别那些繁琐、复杂的写法。那么,Lambda 表达式到底是什么?为什么它会成为 Java 8 的一颗璀璨明珠?让我们一探究竟。
什么是 Lambda 表达式?
你可能已经知道,Java 之前的编程习惯是利用匿名类来实现一些接口的行为,比如线程的执行或者事件的处理。然而,这种做法会导致代码膨胀和冗长,特别是对于一些简单的操作来说,匿名类的冗余性显得尤为明显。让我们先来看看传统的写法:
传统匿名类的写法
java
public class Test {
public static void main(String[] args) {
// 使用匿名类
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程正在运行...");
}
});
thread.start();
}
}
代码解析:
- Thread thread = new Thread(new Runnable() {...}); 这一行创建了一个新的线程,它接受一个
Runnable
类型的对象作为参数,这里使用的是匿名类。 - 匿名类中实现了
Runnable
接口,并重写了其中的run()
方法,这个方法的内容是线程需要执行的任务。在run()
方法中,我们打印了"线程正在运行..."。 thread.start();
这行代码启动了新创建的线程。
然而,尽管这段代码能够正常运行,但它非常冗长,尤其是对于简单的任务,我们甚至需要为它创建一个匿名类,写很多不必要的代码。
使用 Lambda 表达式简化代码
好消息来了------Java 8 引入了 Lambda 表达式,它让这个问题迎刃而解。Lambda 表达式的基本语法非常简洁:
代码案例1
java
(parameters) -> expression
是不是非常简洁明了哇??
代码解析1
(parameters)
是传递给 Lambda 表达式的参数,可以是零个或多个。例如,在我们后面的例子中传递的是() ->
,表示没有参数。->
是箭头操作符,表示 Lambda 表达式的开始,指向 Lambda 体。expression
是 Lambda 表达式的主体,也就是我们要执行的代码。
代码案例2
那么,让我们用 Lambda 表达式来重写刚才的线程代码:
java
package com.example.javase.wf.jinshiplan.demo202505.demo5;
/**
* @Author wf
* @Date 2025-06-20 09:30
*/
public class Test1 {
public static void main(String[] args) {
// 使用 Lambda 表达式
Thread thread = new Thread(() -> System.out.println("线程正在运行..."));
thread.start();
}
}
代码解析2
Thread thread = new Thread(() -> System.out.println("线程正在运行..."));
这一行,我们用 Lambda 表达式替代了匿名类,简洁明了。() -> System.out.println("线程正在运行...");
这里,()
表示没有传入参数,->
表示这是 Lambda 表达式的开始,System.out.println("线程正在运行...");
是执行的代码。thread.start();
和之前一样,启动了线程。
只用一行简洁的代码,我们就完成了线程的创建和启动。相比传统的匿名类写法,Lambda 表达式让代码更加简洁、可读性更强,也避免了冗长的类声明。
结果运行展示2
根据如上案例,本地实际结果运行展示如下,仅供参考:

为什么 Lambda 表达式值得学习?
1. 简化代码:让你告别冗长
Java 8 之前,很多功能的实现需要写出冗长的匿名类,这样的代码不仅难以维护,还让人难以理解。用 Lambda 表达式后,代码变得更加简洁,易于维护。你可以将复杂的逻辑直接传递给方法,减少了不必要的类定义,让代码更直观。
2. 增强可读性:更像自然语言
Lambda 表达式的语法是非常贴近自然语言的。例如,我们在集合中遍历元素时,Lambda 表达式让代码的意思更加清晰。例如,下面是使用 Lambda 表达式的代码:
java
List<String> list = Arrays.asList("Java", "Python", "JavaScript", "C++");
list.forEach(item -> System.out.println(item));
代码解析:
- List list = Arrays.asList("Java", "Python", "JavaScript", "C++"); 这里我们创建了一个包含字符串的列表。
- list.forEach(item -> System.out.println(item)); 使用
forEach
方法和 Lambda 表达式遍历列表中的每个元素,并打印出来。 item -> System.out.println(item)
这是 Lambda 表达式,item
是列表中每个元素,System.out.println(item)
是对每个元素执行的操作。
一眼看去,这段代码非常直接:对列表中的每一个元素,调用 System.out.println
输出它。相比之下,使用传统方式,你可能会写出类似下面这样的代码:
java
for (String item : list) {
System.out.println(item);
}
虽然这两者看起来功能上是一样的,但 Lambda 表达式的方式更加简洁,表达方式更清晰,省略了 for
循环的语法结构,让我们能更专注于业务逻辑。
3. 提高灵活性:与 Java Stream 配合使用
如果你还没有听说过 Java Stream,那么可以说你离 Java 8 的真正精髓还有一步之遥。Stream API 让集合数据的操作变得更加灵活和简洁,而 Lambda 表达式与 Stream 的结合,简直是一对黄金搭档。Stream API 是 Java 8 中引入的一个新特性,允许我们以声明式的方式来操作数据流。结合 Lambda 表达式,我们能够轻松进行数据的过滤、映射、排序等操作。
让我们来看看一个例子,如何使用 Lambda 表达式和 Stream 来操作数据:
java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// 使用 Stream 和 Lambda 表达式过滤出偶数并打印
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println("偶数: " + evenNumbers);
}
}
代码解析
- List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 创建一个整数列表,包含数字 1 到 9。
- numbers.stream() 将列表转换为一个 Stream,这样我们就可以使用 Stream API 对数据进行操作。
- .filter(n -> n % 2 == 0) 使用
filter
方法和 Lambda 表达式筛选出所有偶数。Lambda 表达式n -> n % 2 == 0
表示选取所有能被 2 整除的元素。 - .collect(Collectors.toList()) 将过滤后的偶数收集到一个新的列表中。
- System.out.println("偶数: " + evenNumbers); 打印筛选出的偶数列表。
通过结合 Lambda 和 Stream,我们能够简洁地过滤数据。这种风格不但清晰,而且提升了代码的表达能力。再也不需要那些复杂的 for
循环,取而代之的是简洁的、易懂的 Lambda 表达式。
结果运行展示
根据如上案例,本地实际结果运行展示如下,仅供参考:

4. 函数式编程:解放思想,减少副作用
Lambda 表达式不仅仅是简化代码,它还引入了函数式编程的思想。在函数式编程中,函数是第一公民,你可以像使用数据一样使用函数。这种思维方式的引入,让 Java 在一定程度上告别了面向对象编程的"副作用",使得代码的可预测性和可测试性得到提升。
Lambda 表达式的实际应用:更轻松地与集合操作结合
集合遍历:更简洁的写法
你是否曾经为遍历一个集合而写出冗长的 for
循环?试试 Lambda 表达式吧!它让集合的操作变得更加简洁明了。例如,在遍历一个列表时,我们可以使用 forEach
方法直接传入一个 Lambda 表达式:
java
List<String> list = Arrays.asList("Java", "Python", "C++", "JavaScript");
list.forEach(str -> System.out.println(str));
代码解析:
- List list = Arrays.asList("Java", "Python", "C++", "JavaScript"); 创建一个包含编程语言名称的列表。
- list.forEach(str -> System.out.println(str)); 使用
forEach
方法和 Lambda 表达式遍历列表中的每个元素,str -> System.out.println(str)
就是 Lambda 表达式,表示对每个元素str
执行System.out.println(str)
操作。
数据筛选:过滤、映射更简单
Lambda 和 Stream API 结合后,可以更容易地进行数据的筛选和转换。例如,我们可以从一个学生列表中筛选出所有成绩大于 80 的学生:
测试代码展示
接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:
java
package com.example.javase.wf.jinshiplan.demo202505.demo5;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author wf
* @Date 2025-06-20 09:30
*/
public class Test2 {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Tom", 85),
new Student("Jerry", 70),
new Student("Mickey", 90)
);
List<Student> passedStudents = students.stream()
.filter(student -> student.getScore() > 80)
.collect(Collectors.toList());
passedStudents.forEach(student -> System.out.println(student.getName()));
}
}
附上Student类:
java
package com.example.javase.wf.jinshiplan.demo202505.demo5;
/**
* @Author wf
* @Date 2025-06-20 09:30
*/
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
结果运行展示
根据如上案例,本地实际结果运行展示如下,仅供参考:

代码解析
- List students = Arrays.asList(...); 创建一个学生列表,每个学生包含姓名和成绩。
- students.stream() 将列表转换为 Stream,以便使用 Stream API 进行操作。
- .filter(student -> student.getScore() > 80) 使用
filter
方法和 Lambda 表达式筛选出成绩大于 80 分的学生。 - .collect(Collectors.toList()) 将筛选后的学生收集到一个新的列表中。
- passedStudents.forEach(student -> System.out.println(student.getName())); 遍历筛选后的学生列表,并打印学生姓名。
结语:Lambda 表达式是你 Java 编程的必修课
看完这些例子后,你是不是觉得 Lambda 表达式的魅力无穷?它不仅能够让你的代码更简洁、清晰,还能引领你进入函数式编程的世界,帮助你写出更优雅、更高效的 Java 代码。
如果你还没学会 Lambda 表达式,那就赶紧投入实战使用了,它将会让你屡用屡爽,欲罢不能!反正我是自从用上了Java 8的表达式后,手上就难以戒掉。
最后,大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。