当前位置: 首页 > news >正文

Collectors类作用:

一、Collectors类:

1.1、Collectors介绍

Collectors类,是JDK1.8开始提供的一个的工具类,它专门用于对Stream操作流中的元素各种处理操作,Collectors类中提供了一些常用的方法,例如:toList()、toSet()、toCollection()、toMap()、toConcurrentMap()方法,以及一些分组聚合的方法。

Stream操作流

1.2、常用方法

注意:Collectors类中的方法都是需要和Stream类中的collect()方法结合使用的。

(1)toList、toSet方法

toList、toSet方法是将Stream流中的数据,提取出来,转换成集合返回。

public static List<User> getUserList() {List<User> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(new User(i+11, "name_00" + i, "test_0" + i));}return list;
}
public static void main(String[] args) {List<User> userList = getUserList();// 转换 List 集合List<String> list = userList.stream().map(User::getUname).collect(Collectors.toList());System.out.println(list);// 转换 Set 集合Set<String> list2 = userList.stream().map(User::getPassword).collect(Collectors.toSet());System.out.println(list2);
}

(2)toMap方法

toMap、toConcurrentMap两个方法的作用是一样的,只不过toConcurrentMap方法是线程安全的。这两个方法在使用的时候,至少需要传递两个参数,分别是:

  • 第一个参数:Function类型的参数,作为keyMapper,这是用于指定Map中的key的(必须传递)。
  • 第二个参数:Function类型的参数,作为valuesMapper,这是用于指定Map中的value的(必须传递)。
  • 第三个参数:BinaryOperator类型的参数,这是用于当Map集合中的key重复的时候,执行的解决办法(可选,只有当key重复时候,才会执行这个操作)。
public static void main(String[] args) {List<User> userList = getUserList();// 转换为map集合Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, item -> item, (x, y) -> {if (Objects.equals(x.getId(), y.getId())) {System.out.println("key发生重复啦");return x;}return y;}));System.out.println(userMap);
}

(3)joining方法

joining方法的作用就是将Stream流中的元素按照指定的格式拼接起来,该方法有哪个重载类型,分别如下所示:

  • 第一个方法:joining()无参数方法,直接将所有元素拼接起来。
  • 第二个方法:joining(delimiter)一个参数方法,按照指定的分隔符delimiter拼接元素。
  • 第三个方法:joining(delimiter,prefix,suffix)三个参数方法,按照指定的分隔符delimiter拼接元素,并且在最终拼接结果的前后指定prefix前缀和suffix后缀。
public static void main(String[] args) {List<User> userList = getUserList();// joining 连接String join1 = userList.stream().map(User::getUname).collect(Collectors.joining());String join2 = userList.stream().map(User::getUname).collect(Collectors.joining(","));String join3 = userList.stream().map(User::getUname).collect(Collectors.joining(",", "[", "]"));System.out.println(join1);System.out.println(join2);System.out.println(join3);
}

(4)counting方法

counting方法用于统计元素个数,一般不会单独使用,会和groupingBy结合使用。

// counting 统计
Long count = userList.stream().collect(Collectors.counting());
System.out.println(count);

(5)groupingBy方法

groupingBy方法用于将Stream流中的元素,按照某个分组规则将其分组。groupingBy方法返回值是一个Map集合,集合中的key表示分组的唯一标识,value则表示分组后的所有元素,默认是List集合。

groupingBy方法有多个参数的重载,如下所示:

  • 一个参数的方法:groupingBy(Function key),接收一个Function类型的参数,主要是作为Map集合中的key,默认是返回List集合作为value。
  • 两个参数的方法:groupingBy(Function key,Collector downstream),key是Map的key值,第二个则表示一个收集器,对分组中的所有元素进行收集,然后作为Map对象的value。(*groupingBy可以实现多个字段分组,也就是先按照某个字段分组之后,在对组内的集合按照某个字段继续分组*

在这里插入图片描述

案例代码如下:

public static void main(String[] args) {List<User> userList = new ArrayList<>();userList.add(new User(1001, "java", "123"));userList.add(new User(1002, "html", "123"));userList.add(new User(1003, "css", "123"));userList.add(new User(1004, "js", "123"));userList.add(new User(1005, "java", "123"));userList.add(new User(1006, "css", "123"));// 按照 name 分组Map<String, List<User>> map = userList.stream().collect(Collectors.groupingBy(User::getUname));System.out.println(map);// 按照 name 分组,并且计算每一组中 id 平均值Map<String, Double> map1 = userList.stream().collect(Collectors.groupingBy(User::getUname, Collectors.averagingDouble(User::getId)));System.out.println(map1);
}

(6)partitioningBy方法

partitioningBy方法是分区的,它是一种特殊的分组groupingBy,前面介绍了groupingBy是将数组按照某个key分组成多个集合,最终得到一个Map<key,List>结果。

而这里的partitioningBy意味分区,它是将数据分为两组,一组是满足条件的分区,另外一组则是不满足条件的分组,最终返回的结果是一个Map<boolean,List>的结果格式,其中boolean只有两个值:true和false。

public static void main(String[] args) {// 分区Integer[] nums = new Integer[] { 1, 2, 3, 4, 5 };// 将大于 3 的作为一组Map<Boolean, List<Integer>> map = Arrays.stream(nums).collect(Collectors.partitioningBy(item -> item > 3));System.out.println(map);
}

运行结果如下所示:

在这里插入图片描述

相关文章:

Collectors类作用:

一、Collectors类&#xff1a; 1.1、Collectors介绍 Collectors类&#xff0c;是JDK1.8开始提供的一个的工具类&#xff0c;它专门用于对Stream操作流中的元素各种处理操作&#xff0c;Collectors类中提供了一些常用的方法&#xff0c;例如&#xff1a;toList()、toSet()、to…...

LASSO回归

LASSO回归 LASSO(Least Absolute Shrinkage and Selection Operator&#xff0c;最小绝对值收敛和选择算子算法)是一种回归分析技术&#xff0c;用于变量选择和正则化。它由Robert Tibshirani于1996年提出&#xff0c;作为传统最小二乘回归方法的替代品。 损失函数 1.线性回…...

机器学习中的 K-均值聚类算法及其优缺点。

K-均值聚类算法是一种常见的无监督学习算法&#xff0c;它可以将数据集分成 K 个簇&#xff0c;每个簇内部的数据点尽可能相似&#xff0c;而不同簇之间的数据点应尽可能不同。下面详细讲解 K-均值聚类算法的优缺点&#xff1a; 优点&#xff1a; 简单易用&#xff1a;K-均值…...

云计算与虚拟化

一、概念 什么是云计算&#xff1f; 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果…...

Linux常见进程类别

目录 常见进程类别 守护进程&精灵进程 任务管理 进程组 作业 作业 | 进程组 会话 w命令 守护进程 守护进程的创建 setsid()函数 daemon()函数 模拟实现daemon函数 前台进程 | 后台进程 僵尸进程 | 孤儿进程 僵尸进程的一些细节 守护进程 | 后台进程 守护…...

智能小车之蓝牙控制并测速小车、wife控制小车、4g控制小车、语音控制小车

目录 1. 蓝牙控制小车 2. 蓝牙控制并测速小车 3. wifi控制测速小车 4. 4g控制小车 5. 语音控制小车 1. 蓝牙控制小车 使用蓝牙模块&#xff0c;串口透传蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a; 透传即透明传送&#xff0c;是指在数据的传输过…...

指针进阶(一)

指针进阶 1. 字符指针面试题 2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名 3.3 数组指针的使用4. 数组传参和指针传参4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 前言 指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接…...

c# sql 判断表中是否包含指定字段

你可以使用以下方法来判断一个 SQL 数据库中的表是否包含指定的字段。 首先&#xff0c;你需要连接到数据库&#xff0c;然后执行一条 SQL 查询语句来检查表结构。你可以使用 SELECT 语句和 INFORMATION_SCHEMA.COLUMNS 系统视图来获取表中的所有列信息。 下面是一个示例代码…...

08-JVM垃圾收集器详解

上一篇&#xff1a;07-垃圾收集算法详解 如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现&#xff0c;更加没…...

sql_mode详解

文章目录 一、sql_mode作用二、查询sql_mode三、mysql8默认的mode配置&#xff08;6个默认配置&#xff09;四、常见mode详细解释mysql8默认配置了的mode&#xff08;6个&#xff09;需要自己配置的mode&#xff08;4个&#xff09; 五、设置sql_mode&#xff08;一旦设置了&am…...

Vue3的新特性总结

一、Vue3 里 script 的三种写法 首先&#xff0c;Vue3 新增了一个叫做组合式 api 的东西&#xff0c;英文名叫 Composition API。因此 Vue3 的 script 现在支持三种写法。 1、最基本的 Vue2 写法 <template><div>{{ count }}</div><button click"…...

【Node】Mac多版本Node切换

1、查看当前电脑是否安装node node -v或者查看当前电脑通过brew安装的node路径 ls /usr/local/Cellar/node*2、查看可安装的node brew search node3、安装其他版本node 下载需要安装的node版本 brew install node144、brew切换node版本 假设之前的版本是18&#xff0c;需…...

Apache POI

POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API&#xff0c; Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能&#xff0c; 其中使用最多的就是使用POI操作Excel文件。 maven坐标&#xff1a; <dependency><groupId>org.apa…...

个人能做股票期权吗?个人期权交易开户条件新规

个人投资者是可以交易股票期权的&#xff0c;不过期权交易通常需要投资者具备一定的投资经验和风险承受能力&#xff0c;因为期权交易涉及较高的风险和复杂性&#xff0c;下文为大家介绍个人能做股票期权吗&#xff1f;个人期权交易开户条件新规的内容。本文来自&#xff1a;期…...

Java面试整理(一)

开篇 面试,应该都是打工人需要面对的事情。我记得自己以前开始准备Java工程师面试时,都会去看那个《面试宝典》,当时这个“宝典”真的很经典,现在应该还是不少朋友会看这个。我自己经历过了找工作的面试,和企业招聘工作。所以我自己更加想从这两个不同的角度去和大家交流这…...

国家信息中心举办“数字政府建设暨数字安全技术”研讨会:海云安提出数字政府软件供应链安全解决方案

近日&#xff0c;由国家信息中心主办&#xff0c;复旦大学研究院承办的“数字政府建设暨数字安全技术研讨会”在义乌顺利召开。国家信息中心信息与网络安全部副主任禄凯&#xff0c;复旦大学党委常委、宣传部部长陈玉刚&#xff0c;义乌市委常委、常务副市长喻新贵为会议致辞。…...

uniapp 处理 分页请求

我的需求是手机上一个动态滚动列表&#xff0c;下拉到底部时&#xff0c;触发分页数据请求 uniapp上处理分页解决方案 主要看你是如何写出滚动条的。我想到的目前有三种 &#xff08;1&#xff09;页面滚动&#xff1a;直接使用onReachBottom方法&#xff0c;可以监听到达底部…...

最新2米分辨率北极开源DEM数据集(矢量文件)

一、项目背景 美国明尼苏达大学(University of Minnesota)的极地地理空间中心(Polar Geospatial Center, PGC)于2023年8月发布了北极数字高程模型4.1版本(ArcticDEM Mosaic 4.1)。该DEM数据集是革命性的&#xff0c;分辨率达到了2米&#xff0c;而一般的开源DEM数据集分辨率是3…...

【计算机网络】HTTP(下)

本文承接上文的代码进行改造&#xff0c;上文链接&#xff1a;HTTP上 文章目录 1. 实现网站跳转实现 自己的网站跳转 2. 请求方法(get) && 响应方法(post)GET方法POST方法GET与POST的应用场景 3. HTTP状态码在自己设计的代码中发现4043开头的状态码(重定向状态码)永久…...

自学Python03-学会Python中的while循环语句

我们来学习一下怎么使用列表和字典吧&#xff01; 1.列表 首先&#xff0c;我们来学习一下列表。列表是一个有序的集合&#xff0c;它可以包含任何类型的数据&#xff0c;比如数字、字符串或其他列表。我们可以用方括号 [] 来创建一个列表&#xff0c;用逗号分隔各个元素。 …...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...