news 2026/5/30 15:15:14

301. Java Stream API - 元素收集方式详解(进阶版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
301. Java Stream API - 元素收集方式详解(进阶版)

文章目录

  • 301. Java Stream API - 元素收集方式详解(进阶版)
    • 🎯 为什么要关注收集方式?
    • 🧰 收集到自定义集合(Homemade Collection)
    • 🧩 收集到 Set(去重)
    • 🔒 收集到不可变 Set
    • 📦 收集到数组(Array)
      • 🌱 toArray()(基础版本)
      • 🌳 toArray(IntFunction<A[]> generator)
    • 💡 总结:不同收集方式对比

301. Java Stream API - 元素收集方式详解(进阶版)

在使用 Stream API 处理数据时,最终我们往往需要将处理结果“收集”到某种容器中。这个容器可以是 List、Set、自定义集合,甚至是一个数组。

🎯 为什么要关注收集方式?

选择不同的收集方式不仅会影响性能(如是否复制数组、是否预设容量等),还会影响返回结果的类型(是否可修改、是否线程安全等)。本节我们详细讲解各种收集方式的适用场景与实现方式。


🧰 收集到自定义集合(Homemade Collection)

当你需要将结果收集到特定类型的集合中,比如你自定义的列表类或是三方库的集合类型(比如 Apache Commons、Guava 的集合),可以使用:

.collect(Collectors.toCollection(Supplier))

这允许你灵活地定义要收集到哪种集合中。比如:

Stream<String>strings=Stream.of("one","two","three","four");List<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).collect(Collectors.toCollection(LinkedList::new));// 🔧 使用 LinkedListSystem.out.println("Class of result = "+result.getClass());System.out.println("result = "+result);

📌 输出:

Classof result=classjava.util.LinkedListresult=[ONE,TWO]

说明:可以用这个方式指定任何Collection子类,包括第三方集合或者自定义集合。


🧩 收集到 Set(去重)

如果你希望收集的元素去重,可以使用Collectors.toSet()

Stream<String>strings=Stream.of("one","two","three","four");Set<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).collect(Collectors.toSet());System.out.println("Class of result = "+result.getClass());System.out.println("result = "+result);

📌 输出:

Classof result=classjava.util.HashSetresult=[ONE,TWO]

说明

  • 默认返回的是HashSet
  • 元素自动去重
  • 元素顺序不可预测(因为是 HashSet)

🔒 收集到不可变 Set

如果你希望结果是不可变集合(防止被修改),可以使用:

.collect(Collectors.toUnmodifiableSet());

示例:

Stream<String>strings=Stream.of("one","two","three","four");Set<String>result=strings.filter(s->s.length()==3).map(String::toUpperCase).collect(Collectors.toUnmodifiableSet());System.out.println("Class of result = "+result.getClass());System.out.println("result = "+result);

📌 输出:

Classof result=classjava.util.ImmutableCollections$Set12result=[ONE,TWO]

说明:尝试修改这个集合会抛出UnsupportedOperationException异常,适合用于不可变数据流转。


📦 收集到数组(Array)

🌱 toArray()(基础版本)

最基础的toArray()方法会返回Object[]

Object[]arr=stream.toArray();

缺点:丢失具体类型信息,需要强制类型转换。

🌳 toArray(IntFunction<A[]> generator)

推荐使用的版本,可以指定返回类型:

Stream<String>strings=Stream.of("one","two","three","four");String[]result=strings.filter(s->s.length()==3).map(String::toUpperCase).toArray(String[]::new);// 👈 使用构造方法引用System.out.println("result = "+Arrays.toString(result));

📌 输出:

result=[ONE,TWO]

说明

  • String[]::new是构造数组的函数
  • 更安全,更推荐

💡 总结:不同收集方式对比

收集方式适用场景是否可变是否可指定容器类型特点
Collectors.toList()普通场景❌(返回ArrayList最常用
Collectors.toUnmodifiableList()安全性优先Java 9+
Stream.toList()更高性能不可变 ListJava 16+
Collectors.toCollection(...)需要指定集合类型高度灵活
Collectors.toSet()结果需去重❌(返回HashSet自动去重
Collectors.toUnmodifiableSet()去重且不可变Java 9+
toArray()返回数组✅(重载版)常用于需要原始数组场景
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 7:43:31

一文搞懂Qwen3-Embedding-0.6B的文本嵌入全流程

一文搞懂Qwen3-Embedding-0.6B的文本嵌入全流程 1. 引言&#xff1a;为什么我们需要轻量级嵌入模型&#xff1f; 1.1 文本嵌入的本质与现实挑战 你有没有想过&#xff0c;当你在搜索引擎输入“如何提高工作效率”时&#xff0c;系统是怎么从上百万篇文章中找到最相关的结果&…

作者头像 李华
网站建设 2026/5/29 1:50:31

开源大模型商用新选择:通义千问3-14B Apache2.0协议解读

开源大模型商用新选择&#xff1a;通义千问3-14B Apache2.0协议解读 1. 为什么Qwen3-14B值得你立刻关注 如果你正在为团队选型一个能真正落地的开源大模型——既要性能扛得住业务压力&#xff0c;又要部署成本可控&#xff0c;还得合法合规地用在产品里&#xff0c;那Qwen3-1…

作者头像 李华
网站建设 2026/5/29 21:23:45

Unsloth加速秘籍:这些参数设置让你事半功倍

Unsloth加速秘籍&#xff1a;这些参数设置让你事半功倍 1. 引言&#xff1a;为什么微调大模型也能又快又省&#xff1f; 你有没有试过在本地或云端微调一个7B甚至更大的语言模型&#xff1f;是不是经常遇到显存爆了、训练跑不动、等一小时只训了个寂寞的情况&#xff1f;别急…

作者头像 李华
网站建设 2026/5/28 18:23:46

Cute_Animal_For_Kids_Qwen_Image如何部署?详细步骤+代码实例

Cute_Animal_For_Kids_Qwen_Image如何部署&#xff1f;详细步骤代码实例 1. 项目简介&#xff1a;专为儿童设计的可爱动物生成器 你有没有想过&#xff0c;只需要输入一句话&#xff0c;就能生成一张适合孩子看的、软萌可爱的动物图片&#xff1f;现在这已经不是幻想了。Cute…

作者头像 李华
网站建设 2026/5/28 19:49:18

Unsloth真实案例:我在本地电脑上成功训练了Qwen1.5

Unsloth真实案例&#xff1a;我在本地电脑上成功训练了Qwen1.5 1. 这不是实验室里的幻灯片&#xff0c;是我家里的A40显卡跑出来的结果 你有没有试过在自己电脑上微调一个32B级别的大模型&#xff1f;不是云服务器&#xff0c;不是企业级集群&#xff0c;就是你书桌底下那台装…

作者头像 李华
网站建设 2026/5/23 15:04:42

本地AI绘画新选择:麦橘超然Flux控制台真实体验报告

本地AI绘画新选择&#xff1a;麦橘超然Flux控制台真实体验报告 1. 初见即惊艳&#xff1a;这不是又一个WebUI&#xff0c;而是一套“能跑起来”的本地画室 第一次在RTX 3060笔记本上启动麦橘超然Flux控制台时&#xff0c;我盯着终端里跳出来的Running on local URL: http://0…

作者头像 李华