news 2026/4/18 10:40:55

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/4/17 21:15:05

基于plc拉杆箱振动与噪音检测平台设计

基于PLC的拉杆箱振动与噪音检测平台设计 第一章 绪论 拉杆箱的振动与噪音水平是衡量其品质与使用体验的核心指标&#xff0c;传统检测方式多依赖人工主观判断或简易仪器测试&#xff0c;存在检测标准不统一、数据误差大&#xff08;振动幅值偏差≥0.5mm、噪音值偏差≥3dB&#…

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

数字人民币:概念、历史、内容与发展战略!

数字人民币&#xff08;e-CNY&#xff09;是中国人民银行发行的数字形式法定货币&#xff0c;它并非简单的支付工具升级&#xff0c;而是中国金融基础设施的一次深刻变革。下面这个表格梳理了其核心脉络&#xff0c;帮助你快速把握全局。维度核心内容基本概念数字形式的法定货币…

作者头像 李华
网站建设 2026/4/18 4:33:41

招聘“脆皮青年”?这样评估韧性更有效!

近来&#xff0c;“脆皮青年”成了网络热词&#xff0c;形容那些看似健康、但精神或情绪容易“脆裂”的年轻人。当这批成长于信息爆炸、压力多维时代的Z世代乃至更年轻的群体&#xff0c;大量进入实习与校招通道时&#xff0c;如何筛选出兼具专业潜力与心理韧性的候选人&#x…

作者头像 李华
网站建设 2026/3/22 22:56:24

深度测评8个降AI率网站 千笔帮你轻松降AIGC

AI降重工具&#xff1a;让论文更自然&#xff0c;让查重更轻松 随着AI技术在学术写作中的广泛应用&#xff0c;越来越多的专科生开始面临一个共同的问题——论文中AI生成内容的比例过高&#xff0c;导致AIGC率超标&#xff0c;影响最终成绩。如何在保持原文意思不变的前提下&am…

作者头像 李华