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

相关推荐
IT_陈寒40 分钟前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x1 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者2 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重2 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780512 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还2 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy882 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
Fireworks3 小时前
深入vue3源码解读 -- 1、响应式的基础概念
前端
程序员黑豆3 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
hunterandroid3 小时前
文件存储:内部存储与外部存储
前端