java List转Map
在平时的编程过程中,list和map是集合中最常遇到的两种,熟练使用这两种集合是程序员必须具备的技能,list转map的应用常见也是很常遇到的,结合我最近的一个使用场景说一下:
比如我们需要这样的数据 a.id ,a.name b.role 这样的数据,显然这是存在两张表中的,一般我们设计到大数据量的情况下是不会采用连表查询的,连表查询很慢,这个就不多讲了吧。这样我们可以采用批量查询,在a表中查询 a.id ,a.name ,在b表中查询b.id(对应a.id) ,然后封装在两个list中,我们将bList转换为bListMap,在循环中通过key是id相同的,将b.role和a.id,a.name封装在返回类型的bean中。
批量查询的优点还是很明显的,在两个表都是几十万的数据量的情况下,批量查询的时间要比连表查询或者循环查询的时间节省了大概7倍或8倍,这是我亲测的。其中list转map扮演着很重要的角色。将批量查询出的结果在代码层进行组装,还是很快的,因为map的底层是走hash的。而且节省了查库的io请求时间,所以,还是比较快的。
下面是一些具体的使用demo
package test;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Apple {private Integer id;private String name;private BigDecimal money;private Integer num;public Apple(Integer id, String name, BigDecimal money, Integer num) {this.id = id;this.name = name;this.money = money;this.num = num;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getMoney() {return money;}public void setMoney(BigDecimal money) {this.money = money;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}@Overridepublic String toString() {return "Apple{" +"id=" + id +", name='" + name + '\'' +", money=" + money +", num=" + num +'}';}public static void main(String[] args) {List<Apple> appleList = new ArrayList<Apple>();//存放apple对象集合Apple apple1 = new Apple(1,"苹果1",new BigDecimal("3.25"),10);Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);Apple apple2 = new Apple(2,"香蕉",new BigDecimal("2.89"),30);Apple apple3 = new Apple(3,"荔枝",new BigDecimal("9.99"),40);appleList.add(apple1);appleList.add(apple12);appleList.add(apple2);appleList.add(apple3);/*** List -> Map* 需要注意的是:* toMap 如果集合对象有重复的key,会报错Duplicate key ....* apple1,apple12的id都为1。* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2* 1. List转Map* id为key,apple对象为value,可以这么做:*/Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1, k2)->k1));System.err.println(appleMap);// 打印 : {1=Apple{id=1, name='苹果1', money=3.25, num=10}, 2=Apple{id=2, name='香蕉', money=2.89, num=30}, 3=Apple{id=3, name='荔枝', money=9.99, num=40}}// 2. 分组//List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));System.err.println("groupBy:"+groupBy);//打印 :groupBy:{1=[Apple{id=1, name='苹果1', money=3.25, num=10}, Apple{id=1, name='苹果2', money=1.35, num=20}], 2=[Apple{id=2, name='香蕉', money=2.89, num=30}], 3=[Apple{id=3, name='荔枝', money=9.99, num=40}]}// 3. 过滤filter//从集合中过滤出来符合条件的元素:List<Apple> filterList = appleList.stream().filter(a -> a.getId().equals(1)).collect(Collectors.toList());System.err.println("filterList:"+filterList);// 打印: filterList:[Apple{id=1, name='苹果1', money=3.25, num=10}, Apple{id=1, name='苹果2', money=1.35, num=20}]// 4、将集合中的数据按照某个属性求和://计算 总金额BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);System.err.println("totalMoney:"+totalMoney);//totalMoney:17.48//计算 数量int sum = appleList.stream().mapToInt(Apple::getNum).sum();System.err.println("sum:"+sum); //sum:100//sum:100}}
上面是JDK的写法(推荐),我们还可以使用guava写法
Map<Long, User> maps = Maps.uniqueIndex(userList, new Function<User, Long>() {@Overridepublic Long apply(User user) {return user.getId();}});
java List转Map相关推荐
- Java 8 中 Map 骚操作之 merge() 的用法
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | juejin.im/post/5d9b455a ...
- java Gson转map与map转gson
java Gson转map与map转gson gson库下载地址:http://code.google.com/p/google-gson/downloads/list java代码: public ...
- 1.7 Java 8中Map新增的方法
Java 8 除了为 Map 增加了 remove(Object key, Object value) 默认方法之外,还增加了如下方法. 名称 说明 Object compute(Object key ...
- java中把map转换成list
private String key; private String value; //把map转换成list的公共方法 public static List map ...
- (7)Java数据结构--集合map,set,list详解
MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...
- Java中使用Map and Fold进行功能性编程
在函数式编程中,Map和Fold是两个非常有用的运算符,它们属于每种函数式语言. 如果Map和Fold运算符是如此强大且必不可少,那么您如何解释说即使Java编程语言缺少这两个运算符,我们也可以使用J ...
- 谈谈java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...
- java map中套map_Java Map – Java中的Map
java map中套map Java Map is part of collections framework. Java Map object is used to store key-value ...
- Java 调用Google Map Api解析地址,解析经纬度实例
Java 调用Google Map Api解析地址,解析经纬度实例 使用google地图的反向地址解析功能,提供一个经纬度得到对应地址,或者给出模糊地址,得到经纬度,放在java后台代码中处理,这个使 ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
最新文章
- OpenCV畸变校正原理以及损失有效像素原理分析
- cygwin下安装软件
- MIT自然语言处理第三讲:概率语言模型
- 语言分类,我接触和我想学习的
- MicroRNA Ranking(Tehran2016)
- word-break:break-all和word-wrap:break-word的区别
- 要闻君说:5G手机真的来了?TCL转型科技企业!鹅厂云部门发布态势报告, DDoS攻击正式进入Tb时代!天上“跑”起出租车?...
- 猜字游戏(python版加C语言版)
- 半边数据结构(The_Half-Edge_Data_Structure)
- 性能优化之无阻塞加载脚步方法比较
- VsCode 中 vue代码格式化 (整理代码)
- 东南大学2014计算机考研真题,2014年东南大学920信号数电考研真题(回忆版)
- VS2008中关于“加载安装组件时遇到问题。取消安装”的解决办法
- 【数据结构Python描述】自底向上构建二叉堆实现及其O(n)时间复杂度分析
- 科学家发现程序员秃头新原因,毛囊干细胞竟会悄悄逃走
- 怎么样简单的进行dwg转pdf格式
- 深度好文| Redis面试全攻略
- 在横道图中如何实现多级项目计划管控
- 面试专题-电商项目面试篇
- E - Ricochet Robots( dfs+hash优化 )