精通 Java 8 (Lambda expression & functional interface) - 第2天

发布: (2026年2月1日 GMT+8 23:55)
5 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的具体文本内容,我将按照要求保留来源链接、格式和技术术语,仅翻译正文部分。

什么是 Lambda 表达式? – “匿名函数”

lambda 表达式是一种简洁的方式,用于表示匿名(无名)函数。
它让你可以把“代码视为数据”,并显著减少样板代码。

结构

(parameters) -> { body }
部分描述
(parameters)输入参数。
• 单个参数 → 括号可省略,例如 s -> …
• 无参数 → 空括号,例如 () -> …
->(箭头符号)分隔参数列表和实现体。它的含义相当于“指向”或“执行”。
{ body }要执行的代码。
• 单个表达式 → 省略 {}return 关键字(结果会隐式返回)。
• 多条语句 → 保留 {},并在需要返回值时使用 return

示例:旧方式 vs. Lambda 方式

Java 8 之前 – 匿名内部类

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

Anonymous inner class example

使用 Lambda 表达式 – 简洁清晰

button.addActionListener(e -> System.out.println("Button clicked!"));

Lambda expression example

注意,Lambda 去除了所有冗余代码,专注于实际操作。

Lambda 的“家” – 函数式接口

A 函数式接口 是指声明了 恰好一个抽象方法 的任何接口。
它可以包含任意数量的默认或静态方法,但只有一个方法需要实现。

Common built‑in functional interfaces:

  • Runnable
  • Callable
  • Comparator

Java 8 还引入了 java.util.function 包,提供了一套丰富的即用型函数式接口。

四大核心 – 必备的 java.util.function 接口

这四个是你最常会用到的工作马。

1️⃣ Predicate测试器

  • 目的: 接受类型为 T 的值并返回 boolean。非常适合过滤或条件检查。
  • 抽象方法: boolean test(T t)

示例 – 检查一个数字是否为偶数

Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true

Predicate example

2️⃣ Function转换器

  • 目的: 接受类型为 T 的值并返回类型为 R 的结果。完美用于把一种类型映射到另一种类型。
  • 抽象方法: R apply(T t)

示例 – 将 String 转换为其长度 (Integer)

Function<String, Integer> length = s -> s.length();
System.out.println(length.apply("hello")); // 5

Function example

3️⃣ BiFunction组合器

  • 目的: 接受两个参数(TU),产生类型为 R 的结果。适用于需要合并两个值的操作。
  • 抽象方法: R apply(T t, U u)

示例 – 两个整数相加

BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3, 7)); // 10

BiFunction example

4️⃣ Consumer执行者

  • 目的: 接受类型为 T 的值并返回 void)。它“消费”输入以执行某个动作。
  • 抽象方法: void accept(T t)

示例 – 将消息打印到控制台

Consumer<String> printer = msg -> System.out.println(msg);
printer.accept("Hello, Lambda!");

Consumer example

TL;DR

  • Lambda expressions 让你可以使用最小的语法编写匿名函数。
  • 它们始终针对 functional interface ——即只有一个抽象方法的接口。
  • java.util.function 包提供了最实用的接口,尤其是 Predicate、Function、BiFunction 和 Consumer

Bonus: The Supplier(提供者)

虽然它不是所谓的 “四大” 之一,但 Supplier 同样重要。

  • 目的: 不接受任何输入,返回类型为 T 的单个结果。它 提供 一个值。

  • 抽象方法:

    T get();

示例 – 生成随机数

Supplier<Integer> randomNum = () -> new Random().nextInt(100);
System.out.println(randomNum.get());

Random number supplier example

为什么要使用 Lambdas?

好处显而易见:

  • 简洁的代码 – 减少样板代码,让业务逻辑更突出。
  • 可读性 – 通常更像自然语言,尤其在与 Streams 配合使用时。
  • 函数式编程 – 使 Java 能以更函数式的风格编写代码。
  • Stream API 集成 – Lambdas 是强大 Java Stream API 的核心,能够实现优雅的数据处理。
Back to Blog

相关文章

阅读更多 »

Spring Boot 异常处理

Java 与 Spring Boot 异常处理笔记 1. 什么是 Exception? Exception = 打破程序正常流程的不期望情况。 异常处理的目标……