282. Java Stream API - 从 Collection 或 Iterator 创建 Stream

文章目录

  • [282. Java Stream API - 从 Collection 或 Iterator 创建 Stream](#282. Java Stream API - 从 Collection 或 Iterator 创建 Stream)
      • [✅ 一、从 Collection 创建 Stream(最常见方式)](#✅ 一、从 Collection 创建 Stream(最常见方式))
      • [🧩 二、`Map` 没有 `stream()`,那怎么办?](#🧩 二、Map 没有 stream(),那怎么办?)
        • [📌 示例:打印 Map 中的键值对](#📌 示例:打印 Map 中的键值对)
      • [🧵 三、从 Iterator 创建 Stream(进阶用法)](#🧵 三、从 Iterator 创建 Stream(进阶用法))
        • [🧙 模式结构:](#🧙 模式结构:)
      • [🧪 示例:从自定义 Iterator 创建 Stream](#🧪 示例:从自定义 Iterator 创建 Stream)
      • [🔍 关键参数解析](#🔍 关键参数解析)
      • [💡 用途场景](#💡 用途场景)
      • [🧠 小结](#🧠 小结)
      • [🚀 结语](#🚀 结语)

282. Java Stream API - 从 Collection 或 Iterator 创建 Stream


✅ 一、从 Collection 创建 Stream(最常见方式)

这是最常见、最推荐的方式。

java 复制代码
List<String> list = List.of("Java", "Python", "Go");
Stream<String> stream = list.stream();

几乎所有实现了 Collection 接口的容器(如 List、Set)都可以这样创建流。


🧩 二、Map 没有 stream(),那怎么办?

Map 接口不直接提供 stream() 方法,但它提供了三个间接路径:

想处理什么 使用的方法 示例代码
处理键 map.keySet().stream()
处理值 map.values().stream()
处理键值对 map.entrySet().stream() ✅ 最常用!
📌 示例:打印 Map 中的键值对
java 复制代码
Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 85, "Charlie", 95);

scores.entrySet().stream()
      .filter(e -> e.getValue() > 90)
      .forEach(e -> System.out.println(e.getKey() + " got " + e.getValue()));

输出:

java 复制代码
Charlie got 95

🧵 三、从 Iterator 创建 Stream(进阶用法)

Iterator 是一种轻量级的数据访问方式。虽然不能直接转为 Stream,但 Java 提供了一种"桥接"模式:

🧙 模式结构:
java 复制代码
Iterator<T> → Spliterator<T> → Stream<T>

🧪 示例:从自定义 Iterator 创建 Stream

java 复制代码
Iterator<Integer> iterator = new Iterator<>() {
    private int index = 0;
    public boolean hasNext() {
        return index < 10;
    }
    public Integer next() {
        return index++;
    }
};

long estimateSize = 10L; // 估计元素数量
int characteristics = 0; // 特性(稍后讲)
Spliterator<Integer> spliterator = Spliterators.spliterator(iterator, estimateSize, characteristics);

boolean parallel = false;
Stream<Integer> stream = StreamSupport.stream(spliterator, parallel);

List<Integer> list = stream.toList();
System.out.println("list = " + list);

输出:

java 复制代码
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

🔍 关键参数解析

参数 作用说明
estimateSize 你预估的数据量,影响流的优化(不是必须精确)
characteristics 表示流是否是有序、不可变、大小已知等(以后会讲)
parallel 是否并行处理(true:多线程,false:单线程)

💡 用途场景

这种方式常用于:

  • 第三方库只暴露 Iterator
  • 想将老旧代码中的迭代器逻辑现代化为 Stream 流式处理
  • 在不使用额外集合(如 List)前提下,对数据做流式转换

🧠 小结

创建来源 推荐方式
List/Set collection.stream()
Map map.entrySet().stream()
Iterator StreamSupport.stream(...) 进阶方式

🚀 结语

尽管我们最常用的是 collection.stream(),但在复杂项目中,你可能会处理 Map、Iterator、甚至是数据库游标。这时灵活使用各种流创建方式,将极大提升你的代码表现力与可维护性。

相关推荐
云烟成雨TD3 分钟前
Agent Scope Java 2.x 系列【5】智能体抽象层
java·人工智能·agent
阿伟AI说7 分钟前
Codex 桌面版接入国产模型系列二:Codex++
java·开源软件·ai编程·腾讯云ai代码助手
love_muming28 分钟前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
范什么特西31 分钟前
重点:mybatis注意细节
java·mysql·mybatis
乐观勇敢坚强的老彭39 分钟前
GESP一级核心算法:循环与条件判断的结合
java·数据结构·算法
雪宫街道42 分钟前
SpringBoot 向 IOC 容器注册组件的两种姿势:@Configuration 与 @Import
java·spring boot·后端·spring
北城以北88881 小时前
虚拟机安装JDK,Tomcat,部署项目
java·开发语言·tomcat
终将老去的穷苦程序员1 小时前
基于Android Studio开发的安卓图书借阅管理系统
java·sqlite·android studio·android-studio
技术小结-李爽2 小时前
【工具】Maven的使用
java·maven
sou_time2 小时前
从 0 到 商用:AI Agent x SKILL x MCP 全栈实战教程:L2 高等篇:MCP 协议 + Spring AI + Agent 编排
java·人工智能·spring