JDK 8 List集合使用记录

2023-11-20

        JDK8 的新特性给我们开发带来了很大的便利性,先声明,我没有系统的去学习 JDK8的这些所有新特性,本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法。

1. 提取对象集合中的某一属性集合:

List<对象>  -->  List<属性>

contractInfoList.stream().map(ContractInfo::getId).collect(Collectors.toList());    //contractInfoList - 对象集合; ContractInfo - 集合中的对象

提取List<Map> 中 Map 中指定Key的值:
List<Map> --> List<T>

List<String> customerContactIdList = customerContactList.stream().map(Map -> MapUtils.getString(Map, "id")).collect(Collectors.toList());    //customerContactList - List<Map>

2. 根据对象集合中的某一属性分组:

List<对象>  --> Map<对象属性, List<对象>>

Map<String, List<SysRight>> sysAccountIdMap = sysRightList.stream().collect(Collectors.groupingBy(SysRight::getAccountId));    //sysRightList - 对象集合;SysRight - 对象

3. 批量重置对象集合中的某个属性值:

objList.forEach(sysDataRelated -> sysDataRelated.getSysAttachment().setDeleteUrl("/xxxx/xxx/xxx"));

4. 对象集合中按照某个属性进行正序排序,考虑空值,把空值放在前面

sysDataRelatedList = sysDataRelatedList.stream().sorted(Comparator.comparing(SysDataRelated::getCreateDate, Comparator.nullsFirst(Date::compareTo))).collect(Collectors.toList());

5.对象集合按照某一个属性进行倒序排序,考虑空值

sysDataRelatedList = sysDataRelatedList.stream().sorted(Comparator.comparing(SysDataRelated::getCreateDate, Comparator.nullsFirst(Date::compareTo).reversed())).collect(Collectors.toList());

6. List<对象>转 Map,指定属性作为 key,当前对象作为 value

Map<String, OrderInfo> orderInfoMap  = orderInfoList.stream().collect(Collectors.toMap(OrderInfo::getId, a -> a,(k1,k2)->k1));

7. List<对象>根据指定属性分组

List<T> -> Map<属性, List<T>>

Map<String, List<TagInfoRel>> tagInfoMap = tagInfoRelList.stream().collect(Collectors.groupingBy(TagInfoRel::getDataRelationId));

上述代码最终结果就是以 TagInfoRel 中的属性 dataRelationId 对应的值作为key

8.根据条件过滤

List<String> dataIdList = sysDataRelatedList.stream().filter(s -> null != s.getDataId()).collect(Collectors.toList());

实现效果,从 sysDataReladList 集合中,过滤出 dataId 不为空的记录集合

9.list 分组,多属性拼接分组 List<对象> --> Map<proModelName_proMark, List<对象>>

Map<String, List<CmsProperty>> propertyMap = propertyList.stream().collect(Collectors.groupingBy(propertyKey -> (propertyKey.getProModelName() + "-" +  propertyKey.getProMark())));

9.1 list分组,保证分组后顺序不会乱

Map<String, List<CmsProperty>> propertyMap = propertyList.stream().collect(Collectors.groupingBy(CmsProperty::getProModelName, LinkedHashMap::new, Collectors.toList()));

10.list分组,默认获取第一个 List<对象> --> Map<属性, 对象>

Map<String, CmsPropertyModel> propertyModelMap = cmsPropertyModelList.stream().collect(Collectors.groupingBy(CmsPropertyModel::getName, Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));

11.List<String> 转成 List<Integer>,其他转成 List<Long> 同理

List<Integer> rowNoList = new ArrayList<String>(strList).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList());    //strList 是List<String> 对象

12.对象集合中某一属性累加 

             List<OrderPacking> orderPackingList = orderPackingMapper.selectOrderPackingList(dataMap);
             orderPackingList.stream().mapToInt(e -> e.getNumber().intValue()).summaryStatistics().getSum();    //因为属性number是BigDecimal类型,所以需要做转换

普通集合累加

Double sum = investorList.stream().mapToDouble(n -> CommonUtils.isNumeric(n.getInvestMoney()) ? 
Double.parseDouble(n.getInvestMoney()) : 0.00).summaryStatistics().getSum(); //CommonUtils.isNumeric 判断是否是数字

13. List<Map> 进行分组,并操作分组后的Map数据

Map<String, List<Map>> areaOrderGroupMap = areaMapList.stream().filter(e -> e.containsKey("orderId")).collect(Collectors.groupingBy(e -> MapUtils.getString(e, "receivingProvinceName") + "/" + MapUtils.getString(e, "receivingCityName"), Collectors.collectingAndThen(Collectors.toList(), values -> values.stream().map( d1 -> {
                    d1.remove("receivingProvince");
                    d1.remove("receivingCity");
                    return d1;
                }).collect(Collectors.toList()))));

首先过滤map,留下含有key为 orderId 的Map,然后对过滤后的 list<Map> 进行分组,并操作分组完后的map(移除指定的key)

14. List 转 指定分隔符的 字符串

list.stream().map(SysRight::getName).collect(Collectors.joining(","));

15.两个list 合并去重

List3 = Stream.of(List1, List2).flatMap(Collection::stream).distinct().collect(Collectors.toList());    //list1和List2 合并去重生成 list3

16.双层List 转成单层 : List<List<Object>>  --> List<Object>

List<List<Object>> demoList = new ArrayList<>();
List<Object> reshult = demoList.stream().collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);

17.List 中 BigDecimal 累加

BigDecimal totalAmount = dataList.stream().map(data::getTotalAmount).reduce(BigDecimal.ZERO, BigDecimal::add);

18.list 根据指定属性进行合并,其他指定属性进行累加

List<MaterielPurchaseGoodsDto> goodsDtoList = goodsDtoList.stream().collect(Collectors.toMap(MaterielPurchaseGoodsDto::getCustomerId, a -> a, (o1, o2) -> {
                o1.setAmount(o1.getAmount().add(o2.getAmount()));
                o1.setNumber(o1.getNumber().add(o2.getNumber()));
                o1.setAvgPrice(o1.getAmount().divide(o1.getNumber(), 2, BigDecimal.ROUND_HALF_UP));
                return o1;
            })).values().stream().collect(Collectors.toList());

解析:MaterielPurchaseGoodsDto 中有 customerId, amount, number, avgPrice 属性,当前操作为 将 MaterielPurchaseGoodsDto 列表 根据 customerId 进行合并,合并时,累加 amount, number, avgPrice

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

JDK 8 List集合使用记录 的相关文章

  • [羊城杯 2020]A Piece Of Java

    羊城杯 2020 A Piece Of Java 文章目录 羊城杯 2020 A Piece Of Java 源码分析 从后往前测试 逐步写exp 构造DatabaseInfo类对象 InfoInvocationHandler 动态代理 序
  • JavaWeb案例:实现注册和登录功能

    业务需求分析 在实际开发中 通常会有专门的人去跟客户进行沟通从而了解客户需要什么样的系统 之后由专业的美工将要做的系统以图片的形式表现出来 客户确认后作出一些静态的html demo页面 然后由软件开发人员创建相关数据库 编写代码将该静态页
  • Java的反射技术(Class类,Constructor类,Method类, Field类)

    Java编码时知道类和对象的具体信息 此时直接对类和对象进行操作即可 无需反射 如果编码时不知道类或者对象的具体信息 此时应该使用反射来实现 为什么要使用反射 反射就是把Java类中的各种成分映射成一个个的java对象 例如 一个类有 成员
  • Idea的 Cannot resolve method ‘getAttribute(java.lang.String)‘问题解决

    问题 写javaweb jsp时使用application getAttribute出现报错 Cannot resolve method getAttribute java lang String 解决方法 第一步 File gt Proj
  • MySQL数据库入门超级详细教程

    文章目录 MySQL 1 数据库软件安装 2 为什么要用数据库 3 什么是数据库 4 数据库管理系统 DBMS 5 MySQL 介绍 6 SQL 6 1 SQL 语句概述 6 2 SQL 基本操作 7 表结构操作 7 1 创建数据表 7 2
  • Springboot 实现发送邮件功能,使用QQ邮箱

    引入依赖
  • Redis概述与安装

    Redis简介 首先 简单了解一下NoSQL Not only sql 不要错误的理解为 没有SQL 而是不仅仅是SQL NoSQL工具也是一种简易的数据库 它主要是基于内存的数据库 并提供一定的持久化功能 现在有很多这种技术如 memca
  •  使用jsp实现留言板功能

    使用jsp实现留言板功能 一 开发环境 本项目使用eclipse MySQL8 0进行开发 在开发的过程中使用了一个jar包 mysql connector java 8 0 16 jar 点我下载 二 项目结构 1 index jsp
  • 通俗易懂权限管理模块设计-Java

    最近一直在做CMS系统 发现一些内容其实都是重复出现的 例如权限管理模块 权限管理模块就是为了管理用户是否有权利访问某个权限 如果不能则拒绝访问 其实Java中已经有很成熟的权限管理框架 例如 Shiro Spring Security等
  • javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

    java 验证出现如下错误 javax validation UnexpectedTypeException HV000030 No validator could be found for constraint 错误原因 Java实体类中
  • 利用MVC做一个 常见的管理系统

    登陆的部分 gt 数据库 gt 表 admin id name pass regtime 表与类的映射关系 基于面向对象 转换成对象的操作 gt 登陆页面
  • 如何访问WEB-INF文件夹下的jsp文件

    我们都知道不能直接访问WEB INF文件夹下的jsp文件 那应该怎样访问呢 首先 WEB INF目录是Java WEB应用的安全目录 客户端无法访问 只有服务端可以访问 然后 为什么要这么设计 这样做的初衷是在WEB INF文件夹下放一些不
  • shell脚本中$#、$*、$@、$?、$0-n等含义一次性搞明白!!!

    一 Shell脚本变量的含义 1 表示执行脚本传入参数的个数 2 表示执行脚本传入参数的列表 不包括 0 3 表示进程的id Shell本身的PID ProcessID 即脚本运行的当前 进程ID号 4 Shell最后运行的后台Proces
  • Get,Post请求中文乱码问题有效解决方法

    对于做Java WEB项目同学来说 中文乱码问题是一个经常遇到而又非常头痛的问题 而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程 至于出现乱码的原因不是本文的关注的重点 想了解的朋友可以参考 http zhaomin819111
  • WEB-7-多线程

    多线程 一 背景 二 认识线程 Thread 1 理解 2 进程和线程的区别 高频面试题 3 使用代码创建多线程 三 线程的相关操作 1 创建线程 1 方法一 继承 Thread 类 2 方法二 实现 Runnable 接口 3 其它方法
  • javaweb前后台交互传递数据的几种方法

    前端传后台 form表单传递
  • sql的几种约束,非空,不重

    NOT NULL 用于控制字段的内容一定不能为空 NULL UNIQUE 控件字段内容不能重复 一个表允许有多个 Unique 约束 PRIMARY KEY 也是用于控件字段内容不能重复 但它在一个表只允许出现一个 FOREIGN KEY
  • JavaWeb —— AJAX

    目录 AJAX 基本介绍 A synchronous JavaScript And XML 多用在 1浏览器搜索联想 2用户注册中离开光标 校验数据的正确性 同步和异步的区别 AJAX快速入门 AJAX 基本介绍 A synchronous
  • 解决Jenkins插件不能下载安装的问题

    安装到这一步 显示无法下载Jenkins插件 安装中升级站点 如果你还在安装过程中 遇见这个问题 你可以打开一个新的网页 输入网址http localhost 8080 pluginManager advanced 在最下面的升级站点 把其
  • 【封装】实体类(entity)

    实体类entity 一 ORM 1 1 ORM 实体类 entity 零散数据的载体 1 1 1 ORM应用 一 ORM ORM Object Relational Mapping 从数据库查询到的结果集 ResultSet 在进行遍历时

随机推荐

  • 自定义ViewGroup实现流式布局

    目录 1 View的绘制流程 2 自定义ViewGroup构造函数的作用 3 onMeasure 方法 3 1 View的度量方式 3 2 onMeasure方法参数的介绍 3 3 自定义ViewGroup onMeasure 方法的实现
  • HiveSQL原理和优化详解

    Hive SQL 编译成MapReduce过程 编译 SQL 的任务是在上节中介绍的 COMPILER 编译器组件 中完成的 Hive将SQL转化为MapReduce任务 整个编译过程分为六个阶段 词法 语法解析 Antlr 定义 SQL
  • javascript相关

    1 扁平数据结构转Tree 打平的数据内容如下 let arr id 1 name 部门1 pid 0 id 2 name 部门2 pid 1 id 3 name 部门3 pid 1 id 4 name 部门4 pid 3 id 5 nam
  • vscode编辑器插件总结

    之前一直用webstorm webstorm确实太重了 后来无意中发现了vscode 高颜值吸引了我哈哈哈 就一直用着 很喜欢VScode的插件功能 想要什么插件就搜索 比如搜索angular 只要点击一下某款插件 插件的介绍和用法都会在右
  • feign的Fallback机制

    对接口使用 FeignClient后声明feign客户端后 可以使用属性fallback指定异常处理类 这个类必须实现 FeignClient作用的接口 且被注入到容器中 FeignClient name service provider1
  • 浪潮

    这是一篇旧闻 是我2011年8月6日发在豆瓣上的 前几天重玩豆瓣 看到了 很多怀念 我感到了生命的浪潮 读西哲史有感 o 不会吧 浑浑噩噩的大学生活居然过去一半了啊 当年读 此间的少年 满以为大学就是乔峰 慕容复PK 令狐冲 杨康宿舍里面切
  • 测试分为什么,白盒,黑盒,单元,集成测试?

    一 为什么测试的概念这么多 一个软件项目就好比一部复杂的汽车 有很多零件 当每个零件生产完成后 就要测试零件是否存在质量问题 零件组成复杂的汽车后 我们还要测试汽车 比如著名的中保研 测试刹车 测试气囊 测试防撞 顾客从4s店购买汽车 要带
  • Vue学习(五)登陆页面之重置和发起登陆请求及弹窗提示

    Vue学习 五 登陆页面之重置和发起登陆请求及弹窗提示 表单重置 根据预验证结果决定是否发出登陆请求 编写代码 启动api服务器 弹窗提示 表单重置 直接调用element ui给我们写好的函数就可以了 获取当前表单的实例对象 通过这个实例
  • java中实现多态的机制是什么_java中实现多态的机制是什么? java什么是多态?

    学习java刚刚入门的小伙伴们 不知道大家在初次接触java中的多态一概念的时候 是否能清晰的讲出实现多态的机制是什么吗 什么才是java中的多态呢 多态性是指的面向对象程序设计代码重用的一个重要的机制 对于Java多态性 应该都不是第一次
  • Android Framework——进程间通讯学习,从Binder使用看起

    前言 Binder 是安卓中非常重要的进程间通讯工具 通过Binder 安卓在ServiceManager中对外提供了一系列的服务 学习Binder 将很好地为我们学习framework开个好头 Android 使用多进程 Android
  • 5分钟带你看懂Jeesite10大功能要点

    jeesite内容丰富 集成了大量优秀的组件 是一个值得研究的框架 它有 1 shiro安全权限控制 2 mybatis查询缓存接口扩展 3 ecache分布式缓存整合 4 页面资源缓存优化 5 多数据源灵活切换 6 mybatismapp
  • EasyExcel轻松读取Excel文件!

    EasyExcel是一个Java库 用于快速 简单地读写Excel文件 要使用EasyExcel 您首先需要将其添加为项目的依赖 如果使用Maven 可以添加以下依赖项
  • 算法:二分查找之第一个错误的版本

    方法一 class Solution public int firstBadVersion int n int left 1 int right n while left lt right int mid right left 2 left
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • 4个开源的Java代码静态分析工具

    1 PMD PMD是一款采用BSD协议发布的Java程序代码检查工具 该工具可以做到检查Java代码中是否含有未使用的变量 是否含有空的抓取块 是否含有不必要的对象等 该软件功能强大 扫描效率高 是Java程序员debug的好帮手 PMD支
  • Lex和Yacc应用教程(四).语法树的应用

    Lex和Yacc应用方法 四 语法树的应用 草木瓜 20070515 一 序 不论什么语言 语法结构总是那几种 可以想象任何程序体都可以解释成一棵语法树 语法树的本质是递归 很显然Yacc文法的核心思想也是递归 本文就通过具体实例 使用Ya
  • cesium加载影像的问题解决

    我用gdal把web墨卡托转为经纬度 再切分片时 发现对不上影像 经过两天排查 发现竟然是前端写错 viewer scene imageryLayers addImageryProvider new Cesium UrlTemplateIm
  • vscode乱码

    vscode中文乱码怎么解决 vscode是一款跨平台源代码编辑器 能够在桌面上运行 并且能够用途windows macOS以及Linux 但是有不少小伙伴们在使用vscode时 输入输出的却是中文代码 也不知道如何解决 那么今天小编就来告
  • Ribbon负载均衡策略DynamicServerListLoadBalancer的ServerListFilter解读

    一 DynamicServerListLoadBalancer在类图中的位置 二 DynamicServerListLoadBalancer源码解读 1 关键代码请见注释 2 源码位置 ribbon master ribbon loadba
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt