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

相关推荐
忧郁的Mr.Li6 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
清山博客8 分钟前
OpenCV 人脸识别和比对工具
前端·webpack·node.js
要加油哦~11 分钟前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
程序员Sunday14 分钟前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
yq19820430115619 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
aPurpleBerry23 分钟前
monorepo (Monolithic Repository) pnpm rush
前端
青茶36029 分钟前
php怎么实现订单接口状态轮询请求
前端·javascript·php
暮色妖娆丶1 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
鹏北海1 小时前
micro-app 微前端项目部署指南
前端·nginx·微服务
发现一只大呆瓜1 小时前
虚拟列表:从定高到动态高度的 Vue 3 & React 满分实现
前端·vue.js·react.js