为什么你该立即学习 Java 的 Lambda 表达式?

《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();
    }
}

代码解析:

  1. Thread thread = new Thread(new Runnable() {...}); 这一行创建了一个新的线程,它接受一个 Runnable 类型的对象作为参数,这里使用的是匿名类。
  2. 匿名类中实现了 Runnable 接口,并重写了其中的 run() 方法,这个方法的内容是线程需要执行的任务。在 run() 方法中,我们打印了"线程正在运行..."。
  3. 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

  1. Thread thread = new Thread(() -> System.out.println("线程正在运行...")); 这一行,我们用 Lambda 表达式替代了匿名类,简洁明了。
  2. () -> System.out.println("线程正在运行..."); 这里,() 表示没有传入参数,-> 表示这是 Lambda 表达式的开始,System.out.println("线程正在运行..."); 是执行的代码。
  3. 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));

代码解析:

  1. List list = Arrays.asList("Java", "Python", "JavaScript", "C++"); 这里我们创建了一个包含字符串的列表。
  2. list.forEach(item -> System.out.println(item)); 使用 forEach 方法和 Lambda 表达式遍历列表中的每个元素,并打印出来。
  3. 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);
    }
}

代码解析

  1. List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 创建一个整数列表,包含数字 1 到 9。
  2. numbers.stream() 将列表转换为一个 Stream,这样我们就可以使用 Stream API 对数据进行操作。
  3. .filter(n -> n % 2 == 0) 使用 filter 方法和 Lambda 表达式筛选出所有偶数。Lambda 表达式 n -> n % 2 == 0 表示选取所有能被 2 整除的元素。
  4. .collect(Collectors.toList()) 将过滤后的偶数收集到一个新的列表中。
  5. 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));

代码解析:

  1. List list = Arrays.asList("Java", "Python", "C++", "JavaScript"); 创建一个包含编程语言名称的列表。
  2. 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;
    }
}

结果运行展示

根据如上案例,本地实际结果运行展示如下,仅供参考:

代码解析

  1. List students = Arrays.asList(...); 创建一个学生列表,每个学生包含姓名和成绩。
  2. students.stream() 将列表转换为 Stream,以便使用 Stream API 进行操作。
  3. .filter(student -> student.getScore() > 80) 使用 filter 方法和 Lambda 表达式筛选出成绩大于 80 分的学生。
  4. .collect(Collectors.toList()) 将筛选后的学生收集到一个新的列表中。
  5. passedStudents.forEach(student -> System.out.println(student.getName())); 遍历筛选后的学生列表,并打印学生姓名。

结语:Lambda 表达式是你 Java 编程的必修课

看完这些例子后,你是不是觉得 Lambda 表达式的魅力无穷?它不仅能够让你的代码更简洁、清晰,还能引领你进入函数式编程的世界,帮助你写出更优雅、更高效的 Java 代码。

如果你还没学会 Lambda 表达式,那就赶紧投入实战使用了,它将会让你屡用屡爽,欲罢不能!反正我是自从用上了Java 8的表达式后,手上就难以戒掉。

最后,大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

相关推荐
raoxiaoya28 分钟前
golang编译时传递参数或注入变量值到程序中
开发语言·后端·golang
superkcl20223 小时前
【JAVA】【Stream流】
java·windows·python
mldong3 小时前
mldong 快速开发框架登录模块设计与实现
java·后端·架构
bulucc3 小时前
Maven 或 Gradle 下载和添加 jar 文件的步骤
java·maven·jar
我爱Jack3 小时前
@annotation:Spring AOP 的“精准定位器“
java·后端·spring
一ge科研小菜鸡4 小时前
编程语言的演化与选择:技术浪潮中的理性决策
java·c语言·python
wsdchong之小马过河4 小时前
2025虚幻引擎文件与文件夹命名规律
java·数据库·虚幻
幸运的大号暖贴4 小时前
单点登录进阶:基于芋道(yudao)授权码模式的单点登录流程、代码实现与安全设计
java·安全
小白的代码日记4 小时前
IDEA 中 Tomcat 部署 Java Web 项目(Maven 多模块 & 非 Maven 通用版)(linux+windows)
java·tomcat·intellij-idea