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、甚至是数据库游标。这时灵活使用各种流创建方式,将极大提升你的代码表现力与可维护性。

相关推荐
张柏慈9 小时前
Java性能优化:实战技巧与案例解析
java
天“码”行空9 小时前
简化Lambda——方法引用
java·开发语言
带刺的坐椅9 小时前
MCP 进化:让静态 Tool 进化为具备“上下文感知”的远程 Skills
java·ai·llm·agent·solon·mcp·tool-call·skills
java1234_小锋9 小时前
Java线程之间是如何通信的?
java·开发语言
张张努力变强10 小时前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
while(1){yan}10 小时前
Spring事务
java·数据库·spring boot·后端·java-ee·mybatis
毕设源码-赖学姐11 小时前
【开题答辩全过程】以 高校社团管理平台为例,包含答辩的问题和答案
java
余瑜鱼鱼鱼11 小时前
线程和进程的区别和联系
java·开发语言·jvm
小唐同学爱学习11 小时前
如何解决海量数据存储
java·数据库·spring boot·mysql
962464i11 小时前
SBE(simple-binary-encoding)-Demo
java