前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中Stream的Collector接口详解及原理

Java中Stream的Collector接口详解及原理

作者头像
公众号:码到三十五
发布2024-08-22 15:19:44
1060
发布2024-08-22 15:19:44
举报
文章被收录于专栏:设计模式

Java Stream API的引入极大地简化了集合(Collection)的处理方式,使得开发者能够以声明式的方式处理数据集合。其中,Collector接口是Stream API中一个非常重要的组成部分,它提供了一种灵活的方式来收集Stream处理的结果。

文章目录
  • Collector接口概述
    • 核心方法
    • Characteristics枚举
  • Collector接口的实现
    • 常用收集器示例
  • Collector接口的执行原理

Collector接口概述

Collector接口是Java 8中引入的一个泛型接口,它位于java.util.stream包下。Collector接口主要用于将Stream中的元素收集到某种容器中,如List、Set、Map等。Collector接口定义了四个核心方法(以及一个枚举类型),这些方法共同协作完成收集任务。

核心方法
  1. Supplier supplier():返回一个空的结果容器(A类型),用于存放收集的结果。这个容器是累积器(accumulator)操作的目标。
  2. BiConsumer<A, T> accumulator():一个接受两个参数的函数,第一个参数是累积器(accumulator)的当前值(A类型),第二个参数是Stream中的当前元素(T类型)。该函数用于将Stream中的元素添加到累积器中。
  3. BinaryOperator combiner():一个函数,用于并行流中合并两个累积器的结果。当并行流中的不同部分被并行处理时,每个部分都会有一个累积器,最终这些累积器的结果需要被合并。
  4. Function<A, R> finisher():一个函数,用于将累积器的最终状态(A类型)转换为最终结果(R类型)。在串行流中,这一步是可选的,因为累积器的最终状态可能已经是所需的结果类型。
  5. Set characteristics():返回一个不可变的集合,包含Collector的特征值。这些特征值用于优化收集过程,如并发执行、无序性等。
Characteristics枚举

Collector接口中的Characteristics枚举定义了三个可能的特征值:

  • CONCURRENT:表示此收集器支持并发执行。
  • UNORDERED:表示收集结果不保证与Stream中元素的遍历顺序一致。
  • IDENTITY_FINISH:表示finisher函数是一个恒等操作,即不需要进行额外的转换。

Collector接口的实现

Collector接口的实现通常通过Collectors工具类中的静态方法来完成。Collectors类提供了大量的静态方法,这些方法返回不同类型的Collector实例,以满足不同的收集需求。

常用收集器示例

toList():将Stream中的元素收集到一个List中。

代码语言:javascript
复制
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> collectedNames = names.stream().collect(Collectors.toList());

toSet():将Stream中的元素收集到一个Set中,自动去重。

代码语言:javascript
复制
Set<String> uniqueNames = names.stream().collect(Collectors.toSet());

toMap():将Stream中的元素按照指定的键值对收集到一个Map中。

代码语言:javascript
复制
Map<Integer, String> ageMap = names.stream()
    .collect(Collectors.toMap(name -> name.length(), name -> name));

groupingBy():根据某个属性对流中的元素进行分组。

代码语言:javascript
复制
List<Person> people = Arrays.asList(new Person("Alice", 30), new Person("Bob", 25));
Map<Integer, List<Person>> byAge = people.stream()
    .collect(Collectors.groupingBy(Person::getAge));

Collector接口的执行原理

在Stream的收集过程中,Collector接口的方法按以下顺序执行:

  1. 初始化:通过supplier()方法创建一个空的累积器(结果容器)。
  2. 累积:对于Stream中的每个元素,通过accumulator()方法将其添加到累积器中。在并行流中,这个过程可能在多个线程中并行进行。
  3. 合并(仅并行流):通过combiner()方法合并不同线程中的累积器结果。
  4. 完成:通过finisher()方法(如果定义了)将累积器的最终状态转换为最终结果。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Collector接口概述
    • 核心方法
      • Characteristics枚举
      • Collector接口的实现
        • 常用收集器示例
        • Collector接口的执行原理
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档