Lambda 表达式入门教程

Java 8 带来了一种新的编程模型 - Lambda 表达式,它提供了更简洁的方式来表述匿名函数,能大大简化 Java 代码。本文将详细介绍 Lambda 表达式的语法以及使用场景。


1. Lambda 基础语法

基础语法格式:

复制代码
( 参数列表 ) -> { 方法体 }
  • 参数列表:可以是空的或包含一个/多个参数。

  • -> 符号:分隔参数与方法体。

  • 方法体:可以包含一行或多行代码。

例子 1:比较传统方式和 Lambda

复制代码
// 传统方式
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread is running...");
    }
}).start();

// 使用 Lambda
new Thread(() -> System.out.println("Thread is running...")) .start();

2. Lambda 和集合

例子 2:遍历集合

复制代码
List<String> list = Arrays.asList("Java", "Python", "C++");

// 传统方式
for (String s : list) {
    System.out.println(s);
}

// Lambda 方式
list.forEach(s -> System.out.println(s));

// 方法引用
list.forEach(System.out::println);

例子 3:比较 Comparator

复制代码
List<String> names = Arrays.asList("Tom", "Jerry", "Alice", "Bob");

// 传统方式
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});

// Lambda 方式
names.sort((o1, o2) -> o1.compareTo(o2));

// 方法引用
names.sort(String::compareTo);

3. 函数式接口

Lambda 表达式仅能用于 函数式接口(只包含一个抽象方法的接口)。Java 8 提供了一些常见函数式接口:

  • Consumer<T>: accept(T t)

  • Supplier<T>: get()

  • Function<T, R>: apply(T t)

  • Predicate<T>: test(T t)

例子 4:常见函数式接口

复制代码
// Consumer 接口:接受参数,没有返回值
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello, Lambda!");

// Supplier 接口:没有参数,返回一个值
Supplier<Double> randomNumber = () -> Math.random();
System.out.println(randomNumber.get());

4. Lambda 合併 Stream API

Java 8 提供了 Stream API,配合 Lambda 能大大提高数据处理效率。

例子 5:Stream API 简化数据操作

复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 计算所有偶数的平方和
int sum = numbers.stream()
    .filter(n -> n % 2 == 0)  // 过滤偶数
    .map(n -> n * n)          // 计算平方
    .reduce(0, Integer::sum); // 求和

System.out.println(sum); // 20

5. 总结

  • Lambda 表达式使用更简洁的方式表述匿名函数

  • 仅能用于函数式接口(只包含一个抽象方法的接口)。

  • 和 Stream API 结合使用,能大大提高集合数据处理效率

相关推荐
一路往蓝-Anbo6 小时前
C语言从句柄到对象 (三) —— 抛弃 Malloc:静态对象池与索引句柄的终极形态
c语言·开发语言·数据结构·stm32·单片机·算法
Coder_Boy_6 小时前
基于SpringAI的智能OPS平台AIops介绍
人工智能·spring boot·aiops·faiss
lbb 小魔仙6 小时前
【Java】Spring Data JPA 详解:ORM 映射、查询方法与复杂 SQL 处理
java·开发语言·sql·spring cloud
倚肆6 小时前
Kafka部署指南:单机开发模式与集群生产模式( 4.1.1 版本)
java·分布式·kafka
qq13267029406 小时前
ARM版统信UOS桌面安装JDK
java·jdk·arm·统信uos·毕昇jdk 11
Fighting_p7 小时前
【预览word文档】使用插件 docx-preview 预览线上 word 文档
开发语言·c#·word
码头工人7 小时前
【架构师系列】风控场景下超高并发频次计算服务的设计与实践
java·架构·风控·反爬
superman超哥7 小时前
Rust 发布 Crate 到 Crates.io:从本地到生态的完整旅程
开发语言·后端·rust·crate·crates.io
浪客川7 小时前
【百例RUST - 002】流程控制 基础语法练习题
开发语言·rust
一路往蓝-Anbo7 小时前
C语言从句柄到对象 (二) —— 极致的封装:不透明指针与 SDK 级设计
c语言·开发语言·数据结构·stm32·单片机·嵌入式硬件