【JDK 8 -收集和统计】7.1 collector 收集器

news2025/9/14 12:54:14

一、collect()方法

二、两个重载方法

2.1 方法一

2.2 方法二(常用)

三、Collector 的 作用

四、Collectors 的作用

> Collectors.toList() 

> Collectors.toMap()

> Collectors.toSet()

> Collectors.toCollection() : 用自定义的实现Collection的数据结构收集

五、实战

Stage 1:准备工作,实体类实现Comparable接口

Stage 2:示例

执行结果


一、collect()方法

  • 终端操作用于对流中的数据进行归集操作

  • collect方法接受的参数是一个Collector

二、两个重载方法

  • 在Stream接口里面

2.1 方法一

    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

2.2 方法二(常用)

 <R, A> R collect(Collector<? super T, A, R> collector);

三、Collector 的 作用

  • 就是收集器,也是一个接口,它的工具类Collectors提供了很多工厂方法

四、Collectors 的作用

  • 工具类提供了很多常见的收集器实现

> Collectors.toList() 

  • ArrayList::new,创建一个ArrayList作为累加器

  • List::add,对流中元素的操作就是直接添加到累加器中

  • reduce 操作,对子任务归集结果addAll,后一个子任务的结果直接全部添加到前一个子任务结果中

  • CH_ID 是一个unmodifiableSet集合

Collectors.toMap()

Collectors.toSet()

Collectors.toCollection() : 用自定义的实现Collection的数据结构收集

  • Collectors.toCollection (LinkedList::new)

  • Collectors.toCollection (CopyOnWriteArrayList::new)

  • Collectors.toCollection (TreeSet::new)

五、实战

Stage 1:准备工作,实体类实现Comparable接口

  • TreeSet 的特点是可排序、不重复,即TreeSet要求存放的对象必须是可排序的。如果对象之间不可排序,就会抛出这个异常(cannot be cast to java.lang.Comparable )。

package com.learning.javalearning.lambda.chapter5;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class User implements Comparable<User> {
    private int id;
    private String name;
    private String pwd;
    private int age;

    @Override
    public int compareTo(User o) {
        int cmp = age - o.age;
        return cmp != 0 ? cmp : name.compareTo(o.name);
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", age=" + age +
                '}';
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

Stage 2:示例

import com.learning.javalearning.lambda.chapter5.User;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;

public class CollectDemo {
    public static void main(String[] args) {
        List<User> list = Arrays.asList(new User(1, "陆小凤", 19),
                new User(2, "西门吹雪", 20),
                new User(3, "西门吹雪", 20),//思考为什么返回TreeSet这个User会删除
                new User(4, "叶孤城", 20));
        List<User> result = list.stream().collect(Collectors.toList());
        System.out.println("【不常用】Collectors.toCollection()返回自定义类型:如 Linkedlist");

        List<User> linkedList = list.stream().collect(Collectors.toCollection(LinkedList::new));
        List<User> copyOnWriteArrayList = list.stream().collect(Collectors.toCollection(CopyOnWriteArrayList::new));
        Set<User> treeSet = list.stream().collect(Collectors.toCollection(TreeSet::new));
        System.out.println("LinkedList:" + linkedList);
        System.out.println("CopyOnWriteArrayList:" + copyOnWriteArrayList);
        System.out.println("TreeSet:" + treeSet);

        System.out.println("【常用】直接返回:Collectors.toXXX()");
        List<User> list1 = list.stream().collect(Collectors.toList());
        Set<User> set = list.stream().collect(Collectors.toSet());
        Map<Integer, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getName));
        System.out.println("toList:" + list1);
        System.out.println("toSet():" + set);
        System.out.println("toMap():" + map);
    }
}

执行结果

 

六、参考

如何解决 cannot be cast to java.lang.Comparable问题?_msg1_的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 “人工智能技术与咨询” 发布 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力…

牛客: BM17 二分查找-I

牛客: BM17 二分查找-I 文章目录 牛客: BM17 二分查找-I题目描述题解思路题解代码 题目描述 题解思路 一个左端点, 一个右端点, 循环直到左右端点交叉, 取左右端点的中点 若中点的值大于目标值, 意味着目标值只可能在中点的左边, 所以右端点变为中点的前一个位置 若中点的值…

机器学习第九课--随机森林

一.什么是集成模型 对于几乎所有的分类问题(图像识别除外&#xff0c;因为对于图像识别问题&#xff0c;目前深度学习是标配)&#xff0c;集成模型很多时候是我们的首选。比如构建一个评分卡系统&#xff0c;业界的标配是GBDT或者XGBoost等集成模型&#xff0c;主要因为它的效…

让开源数据开发平台助力提质增效!

用低代码技术平台&#xff0c;可以提高办公协作效率&#xff0c;可以让数据资源变得更有意义和价值&#xff0c;也可以为企业做出更理想的发展决策。作为开源数据开发平台服务商&#xff0c;流辰信息谨守研发初心&#xff0c;一直在低代码技术平台领域努力耕耘&#xff0c;为行…

[Linux入门]---yum软件安装及vim编辑器配置

文章目录 1.Linux软件安装包2.如何安装软件注意事项下载rzsz查看rzsz软件包安装or卸载软件原理 3.简单配置配置文件常用配置选项&#xff08;测试&#xff09;使用插件使用链接配置 1.Linux软件安装包 Linux的三种软件安装方法&#xff1a; ①源代码安装。 在Linux系统下载程序…

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…

二叉搜索树(BST,Binary Search Tree)

文章目录 1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树的查找1.3 二叉搜索树的插入1.4 二叉搜索树的删除 2 二叉搜索树的实现3 二叉搜索树的应用3.1二叉搜索树的性能分析 1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xf…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

LIN - 基础

LIN - 基础 概念CAN/LIN 物理层数据链路层帧格式 概念 原理 基于UART数据格式、主从结构 串行通讯 拓扑 LIN网络中有且只有一个主节点&#xff0c;其他都是从节点 优缺点 功能简单 实时性低 成本低 单主多从&#xff0c;不存在冲突&#xff0c;无需仲裁 主任务/从任务 主任务&…

电脑出现找不到msvcp120.dll无法继续执行代码,不用担心多种方法帮你搞定

今天&#xff0c;我想和大家分享的文章是“msvcp120.dll丢失的修复方法”。我相信&#xff0c;对于我们很多人来说&#xff0c;电脑是我们学习、娱乐的重要工具&#xff0c;而当电脑出现问题时&#xff0c;我们往往束手无策。因此&#xff0c;我希望通过今天的文章&#xff0c;…

笔记-搭建和使用docker-registry私有镜像仓库

笔记-搭建和使用docker-registry私有镜像仓库 拉取/安装registry镜像 和 对应的ui镜像 如果有网络可以直接拉取镜像 docker pull registry docker pull hyper/docker-registry-web没有网络可以使用我导出好的离线镜像tar包, 下载地址https://wwzt.lanzoul.com/i3im1194z12d …

积分值和面积、对称性

积分的基本含义要从积分符号说起&#xff0c;积分号含有加号的意思&#xff0c; ∫ a b f ( x ) d x \int ^b_af(x)dx ∫ab​f(x)dx可以理解为&#xff1a;区间[a,b]无限细分为无穷多个dx,无穷多个f(x)乘以dx的累积和。根据上面的描述&#xff0c;面积可以理解为 ∫ a b ∣ f (…

信息检索与数据挖掘 | (二)布尔检索与倒排索引

文章目录 &#x1f4da;词项-文档关联矩阵&#x1f407;相关名词&#x1f407;词项-文档关联矩阵的布尔查询处理 &#x1f4da;倒排索引&#x1f407;关于索引&#x1f407;建立索引&#x1f407;基于倒排索引的布尔查询处理&#x1f407;查询优化 &#x1f4da;字典数据结构&a…

Cpp/Qt-day040920Qt

目录 时钟 头文件&#xff1a;Widget.h: 源文件:Widget.c: 效果图&#xff1a; 思维导图 时钟 头文件&#xff1a;Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QTime>…

[BSidesCF 2019]Kookie

1.开启环境 2.一开始没仔细看&#xff0c;就看到login as admin 所以输了admin&#xff0c;123 想去爆破密码&#xff0c;但是没啥用 3&#xff0c;又回去看&#xff0c;看到cookie&#xff0c;就抓包&#xff0c;加上cookie usernameadmin

学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集

文章目录 1.模数转换器&#xff08;ADC&#xff09;是什么&#xff1f;手册说明&#xff1a; 2.STC32G单片机ADC使用原理19.1.1 ADC控制寄存器&#xff08;ADC_CONTR)19.1.2 ADC配置寄存器&#xff08;ADCCFG)19.1.4ADC时序控制寄存器&#xff08;ADCTIM&#xff09;19.3 ADC相…

网络安全第一次作业

1、什么是防火墙 防火墙是一种网络安全系统&#xff0c;它根据预先确定的安全规则监视和控制传入和传出的网络流量。其主要目的是阻止对计算机或网络的未经授权的访问&#xff0c;同时允许合法通信通过。 防火墙可以在硬件、软件或两者的组合中实现&#xff0c;并且可以配置为根…

嵌入式:驱动开发 Day9

作业&#xff1a;通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变&#xff08;按键中断&#xff09; 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时…

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的&#xff0c;QEMU模拟VHOST SCSI设备配置空间等&#xff0c;而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。 在QEMU中VHOST SCSI设备继承关系如下&#xff1a; 其它设备以及对应class_init函数和realize具现化实现与V…