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

java8 Stream将List转成Map

在日常开发过程中,后端的小伙伴为了构造特定的数据格式给前端,无法避免需要将List数据转化成Map数据,那么请问遇到这样的问题,你们会如何去完成这件事情呢? 一般来说,肯定是通过遍历的方式去完成数据的转化。但Java 8 有Stream,我们能用它来做点有趣的事情。

假如我们有一个类Product,如下面的代码所示。

@Getter
@Setter
@ToString
@Builder
class Product{
    private Long id;
    private String category;
    private String name;
}

我们现在获取到了List格式的数据。

static List<Product> getList(){
    final List<Product> productList = new ArrayList<>(100);
    for(int i =1;i<=100;i++){
        productList.add(Product.builder()
            .id((long) i)
            .name("name"+i)
            .category("category"+i%9)
            .build());
    }
    return productList;
}

现在,我们要获取以id为key,name为value的Map格式数据,代码如下。

Map<Long, String> map = productList.stream().collect(Collectors.toMap(Product::getId, Product::getName));

那如果要获取以id为key,product为value的Map格式数据,代码如下。

Map<Long, Product> map = productList.stream().collect(Collectors.toMap(Product::getId, data -> data));

那如果要获取以category为key,name为value的Map格式数据,key可能会冲突,如何解决呢,需要传入key冲突解决的策略,代码如下。

#冲突发生时,保留先存在的数据,可按照业务自定义
Map<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing));

那如果要最终获取线程安全的Map,如何解决呢,需要传入一个Supplier<M> mapSupplier,代码如下。

#这里引入的是ConcurrentHashMap,同样的也可以用TreeMap的实现
ConcurrentHashMap<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing, ConcurrentHashMap::new));

来自:
Java8 | 如何优雅地初始化Map & List2Map ? - 掘金

相关文章:

  • ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘xxx.sxxx_.id‘ which is
  • group by 和 where一起使用
  • java求多个Long的平均数,其中可能有null
  • java遍历Map的四种方法
  • win11窗口分1/3 2/3屏的方法
  • java后端实习经验
  • cb.conjunction()的意思
  • spring hashmap线程安全
  • 给el-table动态添加竖线分割
  • 使用hashMap优化两次for循环
  • Spring Boot整合Shiro入门教程
  • jpa关联关系注解 入门教程(一)
  • jpa关联关系注解 入门教程(二)
  • springboot 将对象装换为map
  • springboot 将map装换为java对象
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 30秒的PHP代码片段(1)数组 - Array
  • Centos6.8 使用rpm安装mysql5.7
  • CentOS7 安装JDK
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Docker: 容器互访的三种方式
  • egg(89)--egg之redis的发布和订阅
  • flask接收请求并推入栈
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • httpie使用详解
  • Java读取Properties文件的六种方法
  • Js基础——数据类型之Null和Undefined
  • Mithril.js 入门介绍
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 前端面试总结(at, md)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 物联网链路协议
  • 小程序开发之路(一)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​第20课 在Android Native开发中加入新的C++类
  • (2)MFC+openGL单文档框架glFrame
  • (42)STM32——LCD显示屏实验笔记
  • (WSI分类)WSI分类文献小综述 2024
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net反编译工具
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)