为什么你该立即学习 Java 的 Lambda 表达式?
2025-06-24 08:31 阅读(41)

前言

  大家好,我是不熬夜崽崽。作为一名 Java 后端研发,今天想跟大家聊的是一个老生常谈的话题,不知大家有没有过这样的经历,写代码的时候你总觉得代码中充斥着一堆匿名类,代码看上去比搞笑片还要复杂?尤其是在 Java 中,匿名类总能让你头疼不已。你是不是也觉得,这些冗长的匿名类代码就像是一个个“死结”,越绕越复杂,最后让你深陷其中,无法自拔?

  如果你有过类似的经历,那么你是时候认识 Java 中的一个绝招了——Lambda 表达式。它将彻底改变你与代码打交道的方式,让你享受编程的乐趣,告别那些繁琐、复杂的写法。那么,Lambda 表达式到底是什么?为什么它会成为 Java 8 的一颗璀璨明珠?让我们一探究竟。

什么是 Lambda 表达式?

  你可能已经知道,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

(parameters) -> expression


是不是非常简洁明了哇??

代码解析1


(parameters) 是传递给 Lambda 表达式的参数,可以是零个或多个。例如,在我们后面的例子中传递的是 () ->,表示没有参数。

-> 是箭头操作符,表示 Lambda 表达式的开始,指向 Lambda 体。

expression 是 Lambda 表达式的主体,也就是我们要执行的代码。


代码案例2

那么,让我们用 Lambda 表达式来重写刚才的线程代码:

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 体验AI代码助手 代码解读复制代码

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 输出它。相比之下,使用传统方式,你可能会写出类似下面这样的代码:

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 来操作数据:

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 表达式:

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 的学生:

测试代码展示

接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:

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类:


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的表达式后,手上就难以戒掉。


作者:我崽不熬夜

链接:https://juejin.cn