news 2026/2/2 16:34:42

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/2/2 16:32:18

论文写不动?AI论文平台千笔AI VS 灵感风暴AI,本科生必备!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具正逐步渗透到高校学术写作场景中&#xff0c;成为本科生完成毕业论文的重要助力。越来越多的学生开始借助这些工具提升写作效率、优化内容质量&#xff0c;但面对市场上琳琅满目的AI平台&#xff0c;许多学生在选择时陷入…

作者头像 李华
网站建设 2026/2/2 16:31:11

基于PLC控制系统的材料自动分拣装置设计

基于PLC控制系统的材料自动分拣装置设计 第一章 绪论 材料分拣是制造业生产流转的关键工序&#xff0c;直接影响后续加工效率与产品品质。传统材料分拣多依赖人工筛选&#xff0c;存在分拣效率低&#xff08;单小时分拣≤200件&#xff09;、分拣标准主观化、劳动强度大、易损伤…

作者头像 李华
网站建设 2026/2/2 16:30:19

调用1688开放平台商品分类API获取分类数据

在开发电商系统、进行商品管理或市场分析时&#xff0c;获取准确、完整的商品分类信息是基础且关键的一环。1688开放平台提供了相关的API接口&#xff0c;允许开发者通过编程方式获取其庞大的商品分类体系。本文将介绍如何调用1688的“获取商品分类树”API。一、 接口简介API名…

作者头像 李华
网站建设 2026/2/2 16:27:05

强烈安利!10个AI论文工具测评:专科生毕业论文写作全攻略

在当前学术研究日益数字化的背景下&#xff0c;AI写作工具已成为提升论文效率的重要帮手。然而&#xff0c;面对市场上琳琅满目的产品&#xff0c;如何选择真正适合自己的工具成为一大难题。为此&#xff0c;笔者基于2026年的实测数据与用户反馈&#xff0c;针对专科生这一特定…

作者头像 李华
网站建设 2026/2/2 16:24:36

idea Could not autowire. No beans of ‘xxxx‘ type found

Autowired 时候报错&#xff0c; 在IDEA的spring工程里&#xff0c;经常会遇到 Could not autowire. No beans of xxxx type found 的错误提示。 但程序的编译和运行都是没有问题的&#xff0c;这个错误提示并不会产生影响。 但红色的错误提示在有些有强迫症的程序员眼里&#…

作者头像 李华
网站建设 2026/2/2 16:23:56

设计租房合同条款自查工具,输入合同文本,自动标注霸王条款(如不退押金,乱涨房租),给出修改建议,保护租客权益,操作简单,输出清晰标注版合同。

1. 实际应用场景与痛点 场景 在大城市租房时&#xff0c;租客常遇到以下问题&#xff1a; - 合同条款冗长&#xff0c;法律术语多&#xff0c;普通租客难以快速判断风险 - 存在“霸王条款”&#xff08;如不退押金、随意涨租、单方解约不赔偿等&#xff09; - 签约前没有专业…

作者头像 李华