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 ...
随机推荐
- dotnet 读 WPF 源代码笔记 插入触摸设备的初始化获取设备信息
在 WPF 触摸应用中,插入触摸设备,即可在应用里面使用上插入的触摸设备.在 WPF 使用触摸设备的触摸时,需要获取到触摸设备的信息,才能实现触摸 获取触摸设备插入 在 WPF 中,通过 Window ...
- linux应用程序开发入门
在上一篇文章中学习了linux字符驱动的开发,需要使用应用程序对完成的驱动进行验证,现在开始学习应用程序的开发. 一.准备材料 开发环境:VMware 操作系统:ubuntu 开发版:湃兔i2S-6U ...
- 在IDEA中配置GitHub
目录 在IDEA中配置GitHub 安装GitHub插件 账号授权 方法一:点击Add Account... 添加账号 方法二:使用token登录 共享到GitHub 查看文件变更列表 add文件 移 ...
- cesium教程1-加载显示地图
1.完整示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Splashtop远程桌面再次增强:支持4K视频流
远程桌面工具,主流的有10款总有,国内用的比较多的有teamviewer.Splashtop.向日葵等.几款软件各有千秋,其中Splashtop最大的特性就是快速.流畅.产品无敌,运营佛系,哈哈.下面 ...
- 移动通信网络中的 GTP 协议
目录 文章目录 目录 GTP GTP-C 协议(GTP 控制面) GTP-U 协议(GTP 用户面) GTP' 协议(计费传输) GTPv2 Header GTP GTP(GPRS Tunnellin ...
- 解锁高效创新:IPD策略如何重塑产品开发流程
IPD(集成产品开发)涵盖了产品从创意提出到研发.生产.运营等,包含了产品开发到营销运营的整个过程.围绕产品(或项目)生命周期的过程的管理模式,是一套生产流程,更是时下国际先进的管理体系.IPD(集成 ...
- zabbix使用
安装部署6.0版本 获取仓库 https://www.zabbix.com/cn/download?zabbix=6.0&os_distribution=centos&os_versi ...
- layui合并单元格
在别人的基础上解决了多列合并和同一个页面多个表格的问题 1 //合并单元格 2 function merge(id,res, columsName, columsIndex) { 3 4 var da ...
- CeiT:商汤提出结合CNN优势的高效ViT模型 | 2021 arxiv
论文提出CeiT混合网络,结合了CNN在提取低维特征方面的局部性优势以及Transformer在建立长距离依赖关系方面的优势.CeiT在ImageNet和各种下游任务中达到了SOTA,收敛速度更快,而 ...