news 2026/5/12 14:05:38

311. Java Stream API - 使用收集器作为终端操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
311. Java Stream API - 使用收集器作为终端操作

文章目录

  • 311. Java Stream API - 使用收集器作为终端操作
    • ✅ **使用 Collector 收集流元素**
      • **收集器的不同类型**
      • **收集器的限制**
      • 示例:使用收集器收集流中的元素
        • 示例 1:收集到 `List` 中
      • 输出:
        • 示例 2:收集到 `Set` 中(去重)
      • 输出:
        • 示例 3:使用 `Supplier` 创建 `LinkedList` 并收集元素
      • 输出:
    • ✅ **不可变集合**
      • 示例:收集到不可变集合
      • 输出:
    • ✅ **自定义收集器**
      • 小结:

311. Java Stream API - 使用收集器作为终端操作

Java中,Stream API提供了强大的方式来处理集合数据,其中collect()方法是一种常用的终端操作。该方法允许我们将流中的元素收集到不同类型的集合中,如ListSet或者自定义的集合类型。collect()方法的参数是一个Collector对象,它定义了如何将流中的元素累积到目标集合。

使用 Collector 收集流元素

collect()方法是 Stream 接口中的一个终端方法,接收一个Collector对象作为参数。Collector接口定义了一个API,用于收集数据并将其存储到内存结构中。你可以通过收集器将数据收集到任何实现了Collection接口的类中,或者收集到Map中,甚至是创建字符串或者其他类型的集合。

Java 提供了许多常用的收集器,这些收集器可以通过Collectors工厂类来创建。常见的收集器包括:

  • Collectors.toList():将流元素收集到List中。
  • Collectors.toSet():将流元素收集到Set中。
  • Collectors.toMap():将流元素收集到Map中。

如果这些内置的收集器不能满足需求,你还可以通过实现Collector接口来创建自定义收集器。

收集器的不同类型

  1. 收集到Collection:你可以使用Collectors.toList()Collectors.toSet()将流中的元素收集到ListSet中。
  2. 自定义收集器:如果你需要收集元素到一个不同的集合类型,可以使用toCollection(supplier)方法。通过这个方法,你可以指定使用特定的Supplier来创建集合。

收集器的限制

  • 专门化流IntStreamLongStreamDoubleStream是数值流,它们只支持一个收集器,即不接受Collector类型的参数。因此,无法直接在这些流上使用Collectors.toList()Collectors.toSet()

示例:使用收集器收集流中的元素

示例 1:收集到List
List<Integer>numbers=IntStream.range(0,10).boxed().collect(Collectors.toList());System.out.println("numbers = "+numbers);

此代码段首先使用IntStream.range(0, 10)生成一个从 0 到 9 的整数流。boxed()方法将IntStream转换为Stream<Integer>,然后通过collect(Collectors.toList())将这些元素收集到一个List中。

输出:

numbers=[0,1,2,3,4,5,6,7,8,9]
示例 2:收集到Set中(去重)
Set<Integer>evenNumbers=IntStream.range(0,10).map(number->number/2).boxed().collect(Collectors.toSet());System.out.println("evenNumbers = "+evenNumbers);

此代码段先通过IntStream.range(0, 10)生成一个从 0 到 9 的整数流。然后,使用map()方法将每个数字除以 2,接着将流转换为Stream<Integer>。最后,通过collect(Collectors.toSet())将结果收集到Set中,自动去除重复值。

输出:

evenNumbers=[0,1,2,3,4]
示例 3:使用Supplier创建LinkedList并收集元素
LinkedList<Integer>linkedList=IntStream.range(0,10).boxed().collect(Collectors.toCollection(LinkedList::new));System.out.println("linked list = "+linkedList);

在这个示例中,使用toCollection()方法和LinkedList::new提供的Supplier来创建LinkedList实例,最终将Stream<Integer>中的元素收集到LinkedList中。

输出:

linked list=[0,1,2,3,4,5,6,7,8,9]

不可变集合

有时候,你可能需要收集流中的元素到一个不可变的集合中。Collectors工厂类提供了toUnmodifiableList()toUnmodifiableSet()两个方法,分别用于创建不可变的ListSet

示例:收集到不可变集合

List<Integer>immutableList=IntStream.range(0,5).boxed().collect(Collectors.toUnmodifiableList());System.out.println("immutableList = "+immutableList);

输出:

immutableList=[0,1,2,3,4]

这个immutableList是不可变的,因此不能再向其中添加、删除或修改元素。

自定义收集器

如果你有特别的需求,无法满足于Collectors类提供的常用收集器,你可以实现自己的Collector接口。例如,假设你希望根据某些特定规则将流中的元素分组或累积到自定义的结构中。通过实现Collector接口,你可以完全控制元素的收集过程。

小结:

  1. 常用收集器Collectors.toList()Collectors.toSet()Collectors.toMap()等,适用于将流元素收集到常见的集合类型中。
  2. 自定义收集器:通过实现Collector接口,你可以创建自己的收集器,收集元素到自定义的集合中。
  3. 不可变集合toUnmodifiableList()toUnmodifiableSet()让你可以轻松地创建不可变集合。
  4. 专门化流IntStreamLongStreamDoubleStream不能使用接受Collector参数的collect()方法,只支持一个特殊的收集操作。

收集器是 Java Stream API 中非常强大的功能,通过掌握它的使用,你可以灵活地将流中的元素累积到各种集合中,并且能够根据需求进行扩展和定制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 4:57:32

调用乐天平台API获取商品详情数据

乐天平台提供了丰富的API接口&#xff0c;允许开发者获取平台上的各类数据。其中&#xff0c;获取商品详情&#xff08;通常称为 letian 详情&#xff09;是一个常见的需求。本文将介绍如何调用乐天平台的相关API来获取商品详情数据。1. 准备工作在开始调用API之前&#xff0c;…

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

CI/CD 工具选型指南:Argo CD vs Jenkins vs Arbess

面对众多的CI/CD工具&#xff0c;如何根据功能、价格和易用性做出选择&#xff1f;本文旨在通过多款工具的横向对比&#xff0c;为你提供清晰的梳理与参考。1、Argo CD 1.1 产品介绍Argo CD 是一款基于 GitOps 模型的 Kubernetes 持续交付工具&#xff0c;通过声明式配置实现应…

作者头像 李华
网站建设 2026/5/8 12:56:34

ubuntu24 如何查杀木马病毒?

在 Ubuntu 24.04 中查杀木马病毒主要依赖系统自带的工具、开源安全软件以及良好的安全实践。以下是详细的步骤和建议&#xff1a; 1. 确认系统更新 更新软件包&#xff1a;确保系统和所有软件为最新版本&#xff0c;修复已知漏洞。sudo apt update && sudo apt upgrad…

作者头像 李华
网站建设 2026/4/25 21:10:38

AI代码执行领域爆出首个满分高危漏洞:CVE-2026-22686

2026年开年&#xff0c;AI代码执行领域爆出首个满分高危漏洞CVE-2026-22686&#xff0c;该漏洞直指Node.js生态中专为AI代理设计的enclave-vm沙箱&#xff0c;其CVSS 3.1评分达到10.0满分级别&#xff0c;成为继各类语言解释器漏洞后&#xff0c;AI时代代码隔离场景下的重大安全…

作者头像 李华