Java8-对List转换Map、分组、求和、过滤

2023-11-13

前言

在java8之后我们list转map再也不用循环put到map了,我们用lambda表达式,使用stream可以一行代码解决,下面我来简单介绍list转map的几种方式,和转为map后对map进行分组、求和、过滤等操作。

正文

数据准备

我们准备一个ArrayList,故意让age有一对重复值

List<User> list = new ArrayList<User>();
        User u1 = new User("pangHu", 18);
        User u2 = new User("piKaQiu", 15);
        User u3 = new User("laoBi", 20);
        User u4 = new User("wangHao", 20);
        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);



static class User {
        private String name;
        private int age;

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

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

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

List转Map

我们在List转Map有三种情况,首先说第一种,最简单、简介的一种

第一种

Map<String, User> maps2 = list.stream().collect(Collectors.toMap(User::getName, Function.identity()));

输出结果

{wangHao=User{name='wangHao', age=20}, piKaQiu=User{name='piKaQiu', age=15}, laoBi=User{name='laoBi', age=20}, pangHu=User{name='pangHu', age=18}}

如果我按照一个重复的元素转成map的话就会报错 

Map<Integer, User> maps5 = list.stream().collect(Collectors.toMap(User::getAge, Function.identity()));

报错结果

解决办法就是第二种写法

第二种

 当我们不知道 key 是否有重复时,可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2。

Map<Integer, User> maps = list.stream().collect(Collectors.toMap(User::getAge, a -> a, (k1, k2) -> k1));

输出结果

{18=User{name='pangHu', age=18}, 20=User{name='laoBi', age=20}, 15=User{name='piKaQiu', age=15}}

第三种

如果我们要求map的顺序要按照list的执行的话,我们就要转map的时候指定map的具体实现。

Map<String, User> maps3 = list.stream().collect(Collectors.toMap(User::getName,Function.identity(),(k1, k2) -> k1,LinkedHashMap::new));

输出结果

{pangHu=User{name='pangHu', age=18}, piKaQiu=User{name='piKaQiu', age=15}, laoBi=User{name='laoBi', age=20}, wangHao=User{name='wangHao', age=20}}

 

分组

List里面的对象元素,以某个属性来分组,例如,以age分组,将age相同的放在一起

Map<Integer, List<User>> group = list.stream().collect(Collectors.groupingBy(User::getAge));

输出结果

{18=[User{name='pangHu', age=18}], 20=[User{name='laoBi', age=20}, User{name='wangHao', age=20}], 15=[User{name='piKaQiu', age=15}]}

 

过滤

过滤 list ,从集合中过滤出来符合条件的元素

List<User> filterList = list.stream().filter(a -> a.getName().equals("pangHu")).collect(Collectors.toList());

输出结果

[User{name='pangHu', age=18}]

 

求和

将集合中的数据按照某个属性求和,求和分两种,一种对int 类型求和,一种是浮点类型

第一种

int sum = list.stream().mapToInt(User::getAge).sum();

输出结果 

73

第二种

需要把Demo改成  

 
private BigDecimal age;

List<User> list = new ArrayList<User>();
        User u1 = new User("pangHu", new BigDecimal("18"));
        User u2 = new User("piKaQiu", new BigDecimal("15"));
        User u3 = new User("laoBi", new BigDecimal("20"));
        User u4 = new User("wangHao", new BigDecimal("20"));
        list.add(u1);
        list.add(u2);
        list.add(u3);
        list.add(u4);
BigDecimal totalMoney = list.stream().map(User::getAge).reduce(BigDecimal.ZERO, BigDecimal::add);

输出结果 

73

 

stream还有很多方法比如最大值、最小值、平均值等,想拓展学习可自行查阅资料。

感兴趣的小伙伴可以加微信,带你进大佬云集的群

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8-对List转换Map、分组、求和、过滤 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 树的一些基础概念、堆和 python中heapq模块使用简介

    树定义 树是一种数据结构 比如 目录结构 树是由n个节点组成的集合 n 0 那么是一颗空树 n gt 0 那么存在一个节点为书的根节点 其他节点可分为m个子集 每个子集又为一棵子树 关于树的一些概念 根节点 例 A 叶子节点 不能分叉的节点
  • elementUI中图片上传upload组件,上传图片数据到后台

    结构
  • 【原创】谈谈服务雪崩、降级与熔断

    引言 首先 之所以谈这个话题呢 是发现现在很多人对微服务的设计缺乏认识 所以写一篇扫盲文 当然 考虑到目前大多微服务的文章都是口水文 烟哥争取将实现方式讲透 点清楚 让大家有所收获 OK 我要先说明一下 我有很长一段时间将服务降级和服务熔断
  • 谷粒商城 高级篇 (二) --------- ElasticSearch 检索

    目录 一 初步检索 1 cat 2 索引一个文档 保存 3 查询文档 4 更新文档 5 删除文档 索引 6 bulk 批量 API 7 样本测试数据 二 进阶检索 1 SearchAPI 2 Query DSL 3 Mapping 创建映射
  • 总结:整理 oracle异常错误处理

    5 1 异常处理概念 5 1 1 预定义的异常处理 5 1 2 非预定义的异常处理 5 1 3 用户自定义的异常处理 5 1 4 用户定义的异常处理 5 2 异常错误传播 5 2 1 在执行部分引发异常错误 5 2 2 在声明部分引发异常错
  • SGI STL 第二级空间配置器 内存池

    从内存池中取控件给free list 使用 是chunk alloc的工作 template
  • 程序设计的基本方法

    IPO模式 输入 处理 算法 是程序的灵魂 输出 问题的计算部分 程序编写步骤 分析问题 确定问题 设计算法 编写实现 调试测试 升级维护 编程技巧之流程图 我们写的程序都是有逻辑顺序的 即是有流程的 流程图的作用则是对这种逻辑顺序的一种描
  • jQuery选择器、特殊选择器、筛选器

    一 选择器 ul li class a 1 li li class a 2 li li class b 3 li li class c 4 li li class abc 5 li li li li li ul 1 获取页面中所有的ul标签
  • 颜色代码对照表

    各颜色代码 1 白色 FFFFFF 2 红色 FF0000 3 绿色 00FF00 4 蓝色 0000FF 5 牡丹红 FF00FF 6 青色 00FFFF 7 黄色 FFFF00 8 黑色 000000 9 海蓝 70DB93 10 巧克
  • 使用selenium实现自动登录

    from selenium import webdriver import time driver webdriver Chrome 打开登录页面 url为要打开的地址 driver get url 最大化浏览器 driver maximi
  • 域名系统几类服务器,域名系统

    域名系统 编辑 定义 域名系统 简称为DNS Domain Name System 是因特网使用的命名系统 用来便于人们使用的机器名字转换为IP地址 域名系统其实也称为名字系统 只是更明确地指明这种系统是用在因特网中 域名系统的主要特点是在
  • HTTP请求接口方法(POST/GET)

    private static string HttpPost string Url string postDataStr HttpWebRequest request HttpWebRequest WebRequest Create Url
  • 【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

    最近在进行绘图时 遇到了matplotlib画散点图 并根据目标列的类别来设置颜色区间的问题 但是实现的过程较为艰辛 文章目录 一 数据准备 二 第一次尝试 失败及其原因 2 1 失败 2 2 原因 三 第二次尝试 成功 四 总结 plt
  • Nginx 重写功能(location / rewrite)

    这里写自定义目录标题 一 nginx rewrite概述 1 概述 2 Rewrite跳转场景 3 Rewrite跳转实现 4 Rewrite实际场景 二 Nginx常见模块 三 常见的Nginx正则表达式 1 正则的优势 2 正则的作用
  • shell 多个引号冲突_请教Linux shell命令中双引号与单引号嵌套的问题

    addr 192 168 0 111 echo addr 结果为 192 168 0 111 echo addr 结果为 addr 这两个我还可以理解 1 双引号内的单引号功能被关闭 反之亦然 2 双引号内的 功能被保留 单引号 addr
  • fatal: Authentication failed for ‘https://github.com

    记录在本地电脑建立与GitHub连接时遇到的错误 附上解决方案 git clone 遇到的错误 remote Support for password authentication was removed on August 13 2021
  • osx 常用defaults命令

    defaults命令用来对mac os x系统进行某些设置 常用命令 查看所使用的defaults命令 history grep defaults 分类查看defaults命令 history grep defaults write his
  • JavaScript数据结构——字典(Dictionary)

    概念和结构 字典里面的元素都是一个键 key 值 value 对 字典里面的元素的键 key 不能重复 值 value 可以重复 字典的操作 字典有八种常用操作 分别为 检查键是否存在 has key 添加元素 set key value
  • js 搜索模糊匹配

    searchvalue list keyWord if keyWord var reg new RegExp keyWord var arr for var i 0 i lt list length i if reg test list i
  • Java8-对List转换Map、分组、求和、过滤

    前言 在java8之后我们list转map再也不用循环put到map了 我们用lambda表达式 使用stream可以一行代码解决 下面我来简单介绍list转map的几种方式 和转为map后对map进行分组 求和 过滤等操作 正文 数据准备