news 2026/5/1 6:57:52

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/1 6:25:37

青岛银行:激进的“扩张主义者”

对于大多数的银行来说&#xff0c;当前正面临越来越严峻的挑战&#xff0c;一个是银行的净息差在不断收窄&#xff0c;另一个就是银行整体的营收增长都开始出现了乏力。不过&#xff0c;在这样的大环境下&#xff0c;青岛银行却出现了逆势增长。2026年1月28日&#xff0c;青岛银…

作者头像 李华
网站建设 2026/4/27 14:15:21

学霸同款9个降AIGC平台 千笔AI帮你降AI率

AI降重工具&#xff1a;学霸的隐藏利器 在当今学术写作中&#xff0c;AI生成内容虽然提高了效率&#xff0c;但也带来了AIGC率过高的问题。对于专科生而言&#xff0c;如何在保持论文原创性的同时降低查重率&#xff0c;成为了一道难题。而AI降重工具的出现&#xff0c;为这一困…

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

基于plc控制自动门的设计

基于PLC控制自动门的设计 第一章 绪论 自动门作为商业建筑、办公园区、公共场所的重要出入口设备&#xff0c;其运行稳定性与安全性直接影响通行体验与场所管理效率。传统自动门多采用继电器控制或简易红外触发逻辑&#xff0c;存在响应滞后、防夹功能单一、运行噪音大、缺乏…

作者头像 李华
网站建设 2026/5/1 3:44:51

滑动电阻式位移传感器:工业精密测量的隐形冠军

在智能制造浪潮席卷全球的今天&#xff0c;工业设备对位移测量的精度要求已进入微米级时代。从数控机床的刀具轨迹控制&#xff0c;到工业机器人的关节运动反馈&#xff0c;再到航空航天领域的部件动态监测&#xff0c;位移传感器的性能直接决定着整个系统的可靠性与效率。在众…

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

Flutter艺术探索-Flutter渲染管道:RenderObject与Layer深度解析

Flutter渲染管道深度解析&#xff1a;RenderObject与Layer的协同工作机制 引言&#xff1a;从现象到原理 在日常的Flutter开发中&#xff0c;我们早已习惯用Widget像搭积木一样快速构建界面。但你是否遇到过这样的场景&#xff1a;精心设计的列表一滚动就卡顿&#xff0c;复杂…

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

亲测好用9个降AI率工具,千笔·降AIGC助手帮你解决论文AI痕迹问题

AI降重工具&#xff1a;让论文更自然&#xff0c;让学术更真实 在当前的学术环境中&#xff0c;越来越多的高校和期刊开始使用AIGC检测系统来识别论文中的AI生成内容。对于本科生来说&#xff0c;这无疑增加了论文写作的难度。如何在保持原有语义的基础上&#xff0c;降低AI痕迹…

作者头像 李华