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 动态代理 序
  • JSP&EL表达式&MVC&三层结构综合案例

    文章目录 JSP 1 JSP 概述 2 JSP 快速入门 2 1 搭建环境 2 2 导入 JSP 依赖 2 3 创建 jsp 页面 2 4 编写代码 2 5 测试 3 JSP 原理 4 JSP 脚本 4 1 JSP 脚本分类 4 2 案例
  • Idea的 Cannot resolve method ‘getAttribute(java.lang.String)‘问题解决

    问题 写javaweb jsp时使用application getAttribute出现报错 Cannot resolve method getAttribute java lang String 解决方法 第一步 File gt Proj
  • mybatis中关于example类详解mybatis的Example[Criteria]的使用

    一 什么是example类 mybatis generator会为每个字段产生如上的Criterion 如果表的字段比较多 产生的Example类会十分庞大 理论上通过example类可以构造你想到的任何筛选条件 在mybatis gene
  • Cannot change version of project facet Dynamic Web Module to 2.5 错误

    问题 新建maven webapp项目后 出现Cannot change version of project facet Dynamic web module to 3 0或者2 5 分析 使用Maven新建Web项目时使用的是Artif
  • Idea中Springboot开启热部署方法

    Springboot1 3后支持热部署 具体方法如下 1 增加依赖
  • 数据库设计DDL

    DDL 数据定义语言 用来定义数据库对象 数据库 表 DDL 数据库操作 查询 查询所有数据库 show databases 查询当前数据库 select database 使用 使用数据库 use 数据库名 创建 创建数据库 create
  • 设计模式之六大原则

    设计模式之六大原则 转载 关于设计模式的六大设计原则的资料网上很多 但是很多地方解释地都太过于笼统化 我也找了很多资料来看 发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂 因此转载过来 原作者博客链接 http blog cs
  • Lambda表达式使用详细讲解

    目录 1 新思想 1 1函数式编程思想 1 2 函数式接口 2 通往lambda之路 2 1 什么是lambda表示式 2 2 lambda表示式有哪些特点 2 3 lambda表示式使用场景 2 4 lambda表示式语法 2 5 Lam
  • javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

    java 验证出现如下错误 javax validation UnexpectedTypeException HV000030 No validator could be found for constraint 错误原因 Java实体类中
  • ie11对象不支持此属性和方法 ie11的缓存问题

    更改eclipse的js代码 在ie11上调试 发现调用新更改的方法 在ie11的console输出里 一直提示 对象不支持此属性和方法 点击右上角设置图标 然后点击Internet选项 在常规选项卡里的 浏览器历史记录 点击设置 在弹出的
  • 理解Servlet和Servlet容器、Web服务器等概念

    转载自http blog csdn net iAm333 之前在开源中国看到一篇文章 初学 Java Web 开发 请远离各种框架 从 Servlet 开发 觉得很不错 想到自己之前一直对各种框架执迷不悟 顿感惭愧 于是 看了孙鑫的 Ser
  • 使用Aspect切面实现系统日志并存入数据库

    使用Aspect切面实现系统日志并存入数据库 1 pom xml中 加入Maven依赖
  • JavaWeb —— AJAX

    目录 AJAX 基本介绍 A synchronous JavaScript And XML 多用在 1浏览器搜索联想 2用户注册中离开光标 校验数据的正确性 同步和异步的区别 AJAX快速入门 AJAX 基本介绍 A synchronous
  • 【EasyExcel】 模板填充批量导出,多文件以zip压缩包格式导出

    使用 阿里巴巴的 EasyExcel 填充 excel模板导出 需要支持批量操作 即一个模板循环导出多份 在网上找了下其他大佬们的做法 没有找到想要的 很多都是要先生成excel文件 再压缩导出 但我不想这样做 想直接通过文件流的方式 直接
  • Spring容器和应用上下文理解

    有了Spring之后 通过依赖注入的方式 我们的业务代码不用自己管理关联对象的生命周期 业务代码只需要按照业务本身的流程 走啊走啊 走到哪里 需要另外的对象来协助了 就给Spring说 我想要个对象 于是Spring就很贴心的给你个对象 听
  • 域名解析ip地址的过程

    浏览器会把输入的域名解析成对应的IP 其过程如下 1 查找浏览器缓存 因为浏览器一般会缓存DNS记录一段时间 不同浏览器的时间可能不一样 一般2 30分钟不等 浏览器去查找这些缓存 如果有缓存 直接返回IP 否则下一步 2 查找系统缓存 浏
  • 【JavaWeb】网络原理初识

    网络原理初识 计算机网络的历史 局域网和广域网 网络组件中的重要设备 网络通信基础 基本概念 协议分层 OSI七层模型 TCP IP五层 或四层 模型 封装和分用 发送方 接收方 三层转发和二层转发 计算机网络的历史 计算机最初是为了打仗而
  • JDBC基本概念

    什么是JDBC JDBC概念 JDBC Java DataBase Connectivity 是一套统一的基于Java语言的关系数据库编程接口规范 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库 远端数据库接收到SQL语句后
  • JavaWeb的高级、Listener监听器--Servlet事件

    一 学习目标 1 Listener监听器 2 Listener监听器作用 3 Listener监听器的创建与销毁 二 重点知识 1 Listener监听器 Filter和Listener是Servlet规范中的两个高级特性 不同于Servl

随机推荐

  • 自定义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