Java中Lambda Stream详解

Java中Lambda / Stream详解


🔥 一、Lambda 是什么?(核心概念)

根据资料 LabExDEV Community

Lambda 是 Java 8 引入的匿名函数,用来简化只有一个抽象方法的接口(函数式接口)的写法。

换句话说:
Lambda = 更简洁的函数写法
Lambda = 传递行为(函数)而不是传递对象

📌 Lambda 的基本语法

java 复制代码
(parameters) -> expression
(parameters) -> { statements }

📌 示例:传统写法 vs Lambda

传统写法(匿名类)
java 复制代码
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
}).start();
Lambda 写法
java 复制代码
new Thread(() -> System.out.println("Hello")).start();

更短、更清晰。


🔥 二、Lambda 的本质:函数式接口

资料 DEV Community指出:

Lambda 必须依附于"函数式接口"(只包含一个抽象方法的接口)。

常见函数式接口:

  • Runnable
  • Callable
  • Comparator
  • Predicate<T>
  • Function<T,R>
  • Consumer<T>
  • Supplier<T>

示例:

java 复制代码
Predicate<Integer> isEven = n -> n % 2 == 0;

🔥 三、Stream 是什么?(核心概念)

根据资料 LabEx Baeldung Stack Abuse

Stream 是对集合进行声明式(非命令式)处理的 API,支持链式操作、并行处理、惰性求值。

Stream 不是集合,它不存储数据,只是数据的"流水线"。


🔥 四、Stream 的三大步骤

资料 Baeldung指出 Stream 的典型结构:

1️⃣ 创建 Stream

java 复制代码
List<Integer> list = List.of(1,2,3);
Stream<Integer> s = list.stream();

2️⃣ 中间操作(返回 Stream)

  • filter
  • map
  • sorted
  • distinct
  • limit
  • skip

3️⃣ 终止操作(返回结果)

  • collect
  • forEach
  • reduce
  • count
  • findFirst

🔥 五、Lambda + Stream 实战详解

⭐ 1. filter(过滤)

资料 LabEx Baeldung Stack Abuse都强调 filter 是最常用的操作。

java 复制代码
List<Integer> nums = List.of(1,2,3,4,5,6);

List<Integer> even = nums.stream()
    .filter(n -> n % 2 == 0)
    .toList();

⭐ 2. map(映射)

把一个值转换成另一个值。

java 复制代码
List<String> names = List.of("a", "bb", "ccc");

List<Integer> lengths = names.stream()
    .map(s -> s.length())
    .toList();

⭐ 3. sorted(排序)

java 复制代码
List<Integer> sorted = nums.stream()
    .sorted((a,b) -> b - a)
    .toList();

⭐ 4. reduce(聚合)

java 复制代码
int sum = nums.stream()
    .reduce(0, (a,b) -> a + b);

⭐ 5. collect(收集)

java 复制代码
List<String> upper = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

🔥 六、Stream 的特性(必须掌握)

1️⃣ 惰性求值(Lazy Evaluation)

中间操作不会立即执行,只有终止操作才会触发。

2️⃣ 不修改原集合(函数式思想)

Stream 是不可变的。

3️⃣ 可并行(parallelStream)

java 复制代码
list.parallelStream()
    .filter(...)
    .map(...)
    .toList();

🔥 七、Lambda 与 Stream 的最佳实践(来自资料 Java Guides

✔ 写法简洁但不要过度链式

避免一行写 10 个操作,可读性会变差。

✔ 避免在 Stream 中写复杂逻辑

Stream 适合"数据转换",不适合复杂业务。

✔ 优先使用方法引用(更清晰)

java 复制代码
list.stream().map(String::toUpperCase)

✔ 不要滥用 parallelStream

并行流适合 CPU 密集型任务,不适合 IO。


🔥 八、完整示例:从集合到结果的全流程

java 复制代码
List<String> names = List.of("Alice", "Bob", "Charlie", "David");

List<String> result = names.stream()
    .filter(n -> n.length() > 3)      // 过滤
    .map(String::toUpperCase)         // 转换
    .sorted()                          // 排序
    .toList();                         // 收集

输出:

复制代码
[Alice, Charlie, David] → [ALICE, CHARLIE, DAVID]

📚 引用来源

  • LabExLabEx:Java Lambda 与 Stream 过滤教程
  • DEV CommunityDev.to:Lambda、函数式接口、Stream 深度解析
  • BaeldungBaeldung:Stream.filter 使用指南
  • Stack AbuseStackAbuse:Stream + Lambda 过滤示例

相关推荐
萧青山几秒前
AI阅读增强套件:用苏格拉底诘问+对抗性阅读+知识图谱构建深度阅读技能套件(Python实现)
人工智能·python·知识图谱·ai阅读增强
LongtengGensSupreme12 分钟前
C#图像内存高速拷贝:使用Marshal.AllocHGlobal与ArrayPool实现内存拷贝的几个方法
开发语言·数码相机·c#
Java面试题总结12 分钟前
Python,单引号和双引号有何区别
开发语言·python
鱼子星_21 分钟前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
学逆向的24 分钟前
汇编——函数
开发语言·汇编·网络安全
lhxcc_fly35 分钟前
LangGraph基础知识点
python·langchain·llm·langgraph
Lvan的前端笔记36 分钟前
python:Mac 系统 uv 完整安装+入门实战
python·macos·uv
咸鱼翻身小阿橙38 分钟前
多线程解析
java·开发语言
会飞锦鲤1 小时前
基于YOLOv10的瓜果成熟度智能检测系统
人工智能·python·深度学习·yolo·flask
AOwhisky1 小时前
Python 学习笔记(第四期)——字符串:格式化、操作与文本处理——核心知识点自测与详解
开发语言·笔记·python·学习·列表·元组·字典