java 8 stream toMap问题
最近使用java的stream功能有点多,理由有2:
1)少写了不少代码
2)在性能可以接受的范围内
在巨大的collection基础上使用stream,没有什么经验。而非关键业务上,乐于使用stream。
--
工作中常常需要把ListMap转为Map<String,List<Map<String,Object>>>,所以用toMap。
之所以这么做,主要两个理由:
1)业务需要
2)愿意使用key去寻找,而不是重复遍历数组。完成的代码比较友好,容易看,也容易理解。比较文字比数字友好
例子:
package com.hc.demomain.base.stream; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import com.alibaba.fastjson.JSONObject; public class StreamTest { public static void main(String[] args) {
List<Map<String,Object>> stuList=new ArrayList<Map<String,Object>>(); Map<String,Object> a1=new HashMap<String,Object>();
a1.put("className", "fujian");
a1.put("name", "a1");
a1.put("sex", "男"); stuList.add(a1); Map<String,Object> a2=new HashMap<String,Object>();
a2.put("className", "fujian");
a2.put("name", "a2");
a2.put("sex", "女");
stuList.add(a2); Map<String,Object> b1=new HashMap<String,Object>();
b1.put("className", "beijing");
b1.put("name", "b1");
b1.put("sex", "男");
stuList.add(b1); Map<String,Object> b2=new HashMap<String,Object>();
b2.put("className", "beijing");
b2.put("name", "b2");
b2.put("sex", "女");
stuList.add(b2); Map<String,Object> c1=new HashMap<String,Object>();
c1.put("className", "乌鲁木齐");
c1.put("name", "c1");
c1.put("sex", "女");
stuList.add(c1); Map<String,Object> c2=new HashMap<String,Object>();
c2.put("className", "乌鲁木齐");
c2.put("name", "c2");
c2.put("sex", "男");
stuList.add(c2);
//使用className分组
Map<String,List<Map<String,Object>>> destMap= stuList.stream().collect(Collectors.toMap(
item->item.get("className").toString(),v->{
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
Map<String,Object> m=new HashMap<String,Object>();
m.put("name",v.get("name"));
m.put("sex",v.get("sex"));
list.add(m);
return list;
},
//重複處理
(List<Map<String,Object>> oldList, List<Map<String,Object>> newList) -> {
oldList.addAll(newList);
return oldList;
}
)
);
JSONArray srcObject = (JSONArray)JSONObject.toJSON(stuList);
System.out.println(JSONObject.toJSONString(srcObject, true));
JSONObject jsonObject = (JSONObject)JSONObject.toJSON(destMap);
System.out.println(JSONObject.toJSONString(jsonObject, true)); }
}
以下是原始的ListMap和转换后Map<String,List<Map<String,Object>>> 的对比(为了方便阅读,使用fastJson格式化了下):
原始的ListMap:
[
{
"name":"a1",
"className":"fujian",
"sex":"男"
},
{
"name":"a2",
"className":"fujian",
"sex":"女"
},
{
"name":"b1",
"className":"beijing",
"sex":"男"
},
{
"name":"b2",
"className":"beijing",
"sex":"女"
},
{
"name":"c1",
"className":"乌鲁木齐",
"sex":"女"
},
{
"name":"c2",
"className":"乌鲁木齐",
"sex":"男"
}
]
通过toMap转换后获得的Map<String,List<Map<String,Object>>>:
{
"乌鲁木齐":[
{
"name":"c1",
"sex":"女"
},
{
"name":"c2",
"sex":"男"
}
],
"beijing":[
{
"name":"b1",
"sex":"男"
},
{
"name":"b2",
"sex":"女"
}
],
"fujian":[
{
"name":"a1",
"sex":"男"
},
{
"name":"a2",
"sex":"女"
}
]
}
下次有机会,专门比较下,不同写法的效率!
不过已经有人做过了试验,https://www.cnblogs.com/jpfss/p/11262231.html
java 8 stream toMap问题的更多相关文章
- JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
测试又报bug啦 接到测试小伙伴的问题,说是一个接口不返回数据了,好吧,虽然不是我写的接口任务落到头上也得解决,本地调试了一下,好家伙,直接抛了个异常出来,这又是哪位大哥喝醉了写的代码... Exce ...
- 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
大型网站技术架构(四)--核心架构要素 作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- Java 8 Stream API Example Tutorial
Stream API Overview Before we look into Java 8 Stream API Examples, let’s see why it was required. S ...
- Java 8 Stream
1.关于Java8部分新特性介绍 Java8的新特性很多,在此就不一一介绍了,这里只说一下我自己在工作用用得比较多的几点: 1.1.Lambda表达式 Lambda允许把函数作为一个方法的参数(函数作 ...
- java.util.stream 库简介
Java Stream简介 Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表 ...
- Java 8 Stream 教程
Java 8 Stream Tutorial 本文采用实例驱动的方式,对JAVA8的stream API进行一个深入的介绍.虽然JAVA8中的stream API与JAVA I/O中的InputStr ...
- java集合 stream 相关用法(1)
java8新增一种流式数据,让操作集合数据更简单方便. 定义基本对象: public class Peo { private String name; private String id; publi ...
- Java 8 Stream API的使用示例
前言 Java Stream API借助于Lambda表达式,为Collection操作提供了一个新的选择.如果使用得当,可以极大地提高编程效率和代码可读性. 本文将介绍Stream API包含的方法 ...
- Java 8 Stream API具体解释
Java 8 Stream API具体解释 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStr ...
随机推荐
- 如何阅读 Paper
前言 论文(Paper)通常是新技术.算法.编程方法或软件工具的首次公布.通过阅读论文,我们可以了解最新的技术进展,保持自己的技能和知识是最新的. 同时,论文提供了对特定主题深入理解的机会.它们通常包 ...
- 批量删除WordPress文章和页面的数据库命令和从后台直接删除
批量删除wordpress的方法有两种:1.从wp后台可以调整展示:最多999条 2.选择"Bulk"--"Apply" 通过批量删除wordpress文章和页 ...
- leaflet常用插件汇总介绍
1.Leaflet Ant Path(线条流动效果) 在交通项目.管网应用的项目中,常常需要标注出道路的走向.河流的流向或者管线的流向等等,Leaflet Ant Path能够很好的解决这类问题: g ...
- 5GC 关键技术之 CUPS(控制与用户面分离)
目录 文章目录 目录 前文列表 CUPS(控制与用户面分离) 前文列表 <简述移动通信网络的演进之路> <5G 第五代移动通信网络> <5GC 关键技术之 SBA(基于服 ...
- 安装 MySQL ZIP 版本
安装 MySQL 的 ZIP 版本相对于安装包版本稍微复杂一些,因为它需要手动解压和配置.以下是在 Windows 上安装 MySQL ZIP 版本的步骤: 下载 MySQL ZIP 文件: 前往 M ...
- 京东面试:如何进行JVM调优?
JVM 调优是一个很大的话题,在回答"如何进行 JVM 调优?"之前,首先我们要回答一个更为关键的问题,那就是,我们为什么要进行 JVM 调优? 只有知道了为什么要进行 JVM 调 ...
- c++ 记一次把qrencode源码生成动态库的尝试
在网上搜二维码库:qrencode,源码下载:https://github.com/fukuchi/libqrencode 我的是windows环境,IDE是vs2022. 建立一个动态库的空工程. ...
- 从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”
本文为从零开始写 Docker 系列第十六篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...
- 一文教你如何调用Ascend C算子
本文分享自华为云社区<一文教你如何调用Ascend C算子>,作者: 昇腾CANN. Ascend C是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,兼具开发效率和运 ...
- 在Rainbond中一键部署高可用 EMQX 集群
本文描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 EMQX 集群.这种方式适合不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kubernetes 中部署 E ...