在平时的编程过程中,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相关推荐

  1. Java 8 中 Map 骚操作之 merge() 的用法

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | juejin.im/post/5d9b455a ...

  2. java Gson转map与map转gson

    java  Gson转map与map转gson gson库下载地址:http://code.google.com/p/google-gson/downloads/list java代码: public ...

  3. 1.7 Java 8中Map新增的方法

    Java 8 除了为 Map 增加了 remove(Object key, Object value) 默认方法之外,还增加了如下方法. 名称 说明 Object compute(Object key ...

  4. java中把map转换成list

    private String key;     private String value;          //把map转换成list的公共方法     public static List map ...

  5. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

  6. Java中使用Map and Fold进行功能性编程

    在函数式编程中,Map和Fold是两个非常有用的运算符,它们属于每种函数式语言. 如果Map和Fold运算符是如此强大且必不可少,那么您如何解释说即使Java编程语言缺少这两个运算符,我们也可以使用J ...

  7. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  8. 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 ...

  9. Java 调用Google Map Api解析地址,解析经纬度实例

    Java 调用Google Map Api解析地址,解析经纬度实例 使用google地图的反向地址解析功能,提供一个经纬度得到对应地址,或者给出模糊地址,得到经纬度,放在java后台代码中处理,这个使 ...

  10. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

最新文章

  1. OpenCV畸变校正原理以及损失有效像素原理分析
  2. cygwin下安装软件
  3. MIT自然语言处理第三讲:概率语言模型
  4. 语言分类,我接触和我想学习的
  5. MicroRNA Ranking(Tehran2016)
  6. word-break:break-all和word-wrap:break-word的区别
  7. 要闻君说:5G手机真的来了?TCL转型科技企业!鹅厂云部门发布态势报告, DDoS攻击正式进入Tb时代!天上“跑”起出租车?...
  8. 猜字游戏(python版加C语言版)
  9. 半边数据结构(The_Half-Edge_Data_Structure)
  10. 性能优化之无阻塞加载脚步方法比较
  11. VsCode 中 vue代码格式化 (整理代码)
  12. 东南大学2014计算机考研真题,2014年东南大学920信号数电考研真题(回忆版)
  13. VS2008中关于“加载安装组件时遇到问题。取消安装”的解决办法
  14. 【数据结构Python描述】自底向上构建二叉堆实现及其O(n)时间复杂度分析
  15. 科学家发现程序员秃头新原因,毛囊干细胞竟会悄悄逃走
  16. 怎么样简单的进行dwg转pdf格式
  17. 深度好文| Redis面试全攻略
  18. 在横道图中如何实现多级项目计划管控
  19. 面试专题-电商项目面试篇
  20. E - Ricochet Robots( dfs+hash优化 )

热门文章

  1. InstallShield Crack,虚拟应用程序构建可靠
  2. 在win7和win10上通过INF文件安装64位WDM驱动
  3. css建立一个简单的设备登记表,员工登记表格的CSS块
  4. 3GQQ幻想西游攻略
  5. Autoencoder理解(2): 自动编码器的作用之稀疏编码
  6. DSP方案山景AP8224C2芯片可烧录适用USB声卡降噪麦克风
  7. Android实现选择题答题(包括单选、多选和答题卡)
  8. 免费,好用的画图工具diagrams, 支持在线编辑
  9. 浏览器无法打开搜索引擎页面
  10. 关于shopex网店系统和网店助理的几点优化建议