268. Java Stream API 入门指南

文章目录

  • [268. Java Stream API 入门指南](#268. Java Stream API 入门指南)
      • [🎯 为什么要学习 Stream API?](#🎯 为什么要学习 Stream API?)
    • [🔍 Stream API 的几个核心特点](#🔍 Stream API 的几个核心特点)
      • [✅ 流的来源不仅限于集合!](#✅ 流的来源不仅限于集合!)
      • [✅ 流是懒加载的(`lazy evaluation`)](#✅ 流是懒加载的(lazy evaluation))
    • [📦 示例讲解:按字符串长度分组并计数](#📦 示例讲解:按字符串长度分组并计数)
      • [✅ 输出结果:](#✅ 输出结果:)
      • [🔍 分析说明:](#🔍 分析说明:)
    • [🧠 Stream 的基本使用流程](#🧠 Stream 的基本使用流程)
      • [📌 示例:找出长度大于 3 的字符串并转换为大写:](#📌 示例:找出长度大于 3 的字符串并转换为大写:)
    • [🔧 常用中间操作](#🔧 常用中间操作)
    • [✅ 常用终止操作](#✅ 常用终止操作)
    • [💡 小练习题(课堂互动可用)](#💡 小练习题(课堂互动可用))
    • [📌 总结 Stream API 的优势](#📌 总结 Stream API 的优势)

268. Java Stream API 入门指南

🎯 为什么要学习 Stream API?

Java 8 中,Stream API 是继 Lambda 表达式之后最重要的特性之一。它实现了一个在函数式编程中非常著名的模式 ------ Map-Filter-Reduce(映射-过滤-归约)

📦 简单理解:
集合框架(Collections Framework 负责将数据存储在 JVM 内存中,

Stream API 则是用来高效、优雅地处理这些数据


🔍 Stream API 的几个核心特点

✅ 流的来源不仅限于集合!

  • 可以从集合、数组、I/O、生成器、自定义数据源等创建流。
  • 使用方式统一,处理过程一致,代码更简洁!

✅ 流是懒加载的(lazy evaluation

  • 只有在你调用"终止操作"(如 collect()count() 等)时,流才真正被计算。
  • 这意味着你可以组合多个操作(mapfiltersort 等),它们只在最终需要结果时才执行。

📦 示例讲解:按字符串长度分组并计数

java 复制代码
List<String> strings = List.of("one", "two", "three", "four");

Map<Integer,Long> map = strings.stream()
                 .collect(Collectors.groupingBy(
                     String::length,                // 按字符串长度分组
                     Collectors.counting()          // 每组中元素数量
                 ));

map.forEach((key, value) -> System.out.println(key + " :: " + value));

✅ 输出结果:

java 复制代码
3 :: 2
5 :: 1
4 :: 1

🔍 分析说明:

  • groupingBy(String::length):按字符串长度进行分组。
  • counting():统计每组中有多少个元素。
  • Map<Integer, Long> :生成的 Map 键是字符串长度,值是对应数量。

🧠 Stream 的基本使用流程

我们来套用 Stream 的典型三步流程进行理解:

java 复制代码
数据源 ➜ 中间操作(map/filter/sorted)➜ 终止操作(collect/forEach/count)

📌 示例:找出长度大于 3 的字符串并转换为大写:

java 复制代码
List<String> words = List.of("Java", "is", "awesome", "and", "fun");

List<String> result = words.stream()
                           .filter(s -> s.length() > 3)
                           .map(String::toUpperCase)
                           .collect(Collectors.toList());

System.out.println(result); // 输出: [JAVA, AWESOME]

🔧 常用中间操作

操作 说明 示例
filter 过滤元素 .filter(s -> s.length() > 3)
map 转换元素 .map(String::toUpperCase)
sorted 排序 .sorted(Comparator.reverseOrder())
distinct 去重 .distinct()
limit 取前 N 个 .limit(5)
skip 跳过前 N 个 .skip(2)

✅ 常用终止操作

操作 说明 示例
collect 收集结果(转为 ListMap .collect(Collectors.toList())
forEach 遍历结果 .forEach(System.out::println)
count 统计数量 .count()
findFirst 找到第一个元素(Optional .findFirst()
anyMatch 是否存在满足条件的元素 .anyMatch(s -> s.contains("a"))

💡 小练习题(课堂互动可用)

1️⃣ 从一组单词中过滤出以 "a" 开头的单词,并转为小写,收集成列表

2️⃣ 给一组整数列表,保留偶数,求其平方并排序输出

3️⃣ 给一个字符串列表,统计每种长度的字符串数量


📌 总结 Stream API 的优势

特性 优势说明
声明式 更少的样板代码,代码意图清晰
可组合 中间操作可任意组合,构建复杂逻辑更简单
性能优化 延迟计算、短路操作、可并行
可拓展性强 可用于集合、数组、文件、数据库结果等
相关推荐
m0_736919101 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手1 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_1 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934731 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy1 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
invicinble1 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟2 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖2 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472462 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威3 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos