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 的优势

特性 优势说明
声明式 更少的样板代码,代码意图清晰
可组合 中间操作可任意组合,构建复杂逻辑更简单
性能优化 延迟计算、短路操作、可并行
可拓展性强 可用于集合、数组、文件、数据库结果等
相关推荐
用户298698530147 分钟前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing1 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
兵慌码乱11 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
咖啡八杯12 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
hboot13 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海17 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
用户1285261160220 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk20 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
呱呱复呱呱20 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django