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 通过 DockerfileContext 解决项目放在里层文件夹导致 VisualStudio 构建失败
本文告诉大家,如何解决 csproj 项目文件放入到里层的文件夹,不放在 sln 所在文件夹的第一层子文件夹,导致 VisualStudio 2022 在构建 docker 映像提示找不到文件的问题 ...
- 2019-8-31-dotnet-动态代理魔法书
title author date CreateTime categories dotnet 动态代理魔法书 lindexi 2019-08-31 16:55:58 +0800 2019-06-02 ...
- 开发日志:windows 服务器禁用TLS1.0和TLS1.1协议使网站更安全
SSL/TLS 的版本 协议 发布时间 状态 SSL 1.0 未公布 未公布 SSL 2.0 1995 年 已于 2011 年弃用 SSL 3.0 1996 年 已于 2015 年弃用 TLS 1.0 ...
- 异常值检测算法三:3sigma模型
离散度 标准差是反应一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标.说起标准差首先得搞清楚它出现的目的.我们使用方法去检测它,但检测方法总是有误差的,所以检测值并不是其真实值.检测值与真 ...
- Golang csv操作
目录 csv读写 追加写入 追加写入封装 csv读写 封装成工具包 package utils import ( "encoding/csv" "fmt" &q ...
- 如何使用go module导入本地包
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具. 到今天Go1.14版本推出之后Go modules 功能 ...
- Ubuntu更新源文件报错:E: 仓库 “http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release” 没有 Release 文件。
E: 仓库 "http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release" 没有 Release 文件. 一条 ...
- JS对Cookie的应用--JavaScript实例集锦(初学)
一个网站上的cookie信息可以实现下次自动登录,记录你的历史等等 可以在火狐浏览器查看本地代码的cookie信息: 打开火狐浏览器--点击右键--查看页面信息--安全--查看cookie <! ...
- Sublime Text 3 初试牛刀
每次我在其他视频网站上看学习视频的时候,看着老师用的编辑器高大上档次,而我一般用Notepad,和Dreamweaver去编辑网页,需要每一行代码,打进去,效率低.最近看到sublime编辑器,在网上 ...
- PHP常用排序算法01——冒泡、插入
对于排序算法,相信学计算机的同学都不会陌生.今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(bubbleSort)和插入(insertionSort). PS:对排序等算法还不太了解 ...