背景
在最近的工作开发之中,慢慢习惯了很多Java8中的Stream的用法,很方便而且也可以并行的去执行这个流,这边去写一下昨天遇到的一个list转map的场景。
list转map在Java8中stream的应用
常用方式
1.利用Collectors.toMap方法进行转换

public Map<Long, String> getIdNameMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));
}
1
2
3
其中第一个参数就是可以,第二个参数就是value的值。

2.收集对象实体本身
- 在开发过程中我们也需要有时候对自己的list中的实体按照其中的一个字段进行分组(比如 id ->List),这时候要设置map的value值是实体本身。

public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));
}
 
account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法 Function.identity(),这个方法返回自身对象,更加简洁

重复key的情况。
在list转为map时,作为key的值有可能重复,这时候流的处理会抛出个异常:Java.lang.IllegalStateException:Duplicate key。这时候就要在toMap方法中指定当key冲突时key的选择。(这里是选择第二个key覆盖第一个key)
public Map<String, Account> getNameAccountMap(List<Account> accounts) {
    return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));
}
 
用groupingBy 或者 partitioningBy进行分组
根据一个字段或者属性分组也可以直接用groupingBy方法,很方便。
Map<Integer, List<Person>> personGroups = Stream.generate(new PersonSupplier()).
 limit(100).
 collect(Collectors.groupingBy(Person::getAge));
Iterator it = personGroups.entrySet().iterator();
while (it.hasNext()) {
 Map.Entry<Integer, List<Person>> persons = (Map.Entry) it.next();
 System.out.println("Age " + persons.getKey() + " = " + persons.getValue().size());
}
 
partitioningBy可以理解为特殊的groupingBy,key值为true和false,当然此时方法中的参数为一个判断语句(用于判断的函数式接口)
Map<Boolean, List<Person>> children = Stream.generate(new PersonSupplier()).
 limit(100).
 collect(Collectors.partitioningBy(p -> p.getAge() < 18));
System.out.println("Children number: " + children.get(true).size());
System.out.println("Adult number: " + children.get(false).size());

Java8中list转map方法总结相关推荐

  1. java8中新判空方法之Optional类的使用

    Optional来简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 认识Optional Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用, ...

  2. [vue] Vuex中四个map方法的使用 mapState mapGetters mapActions mapMutations

    1. mapState方法: 用于帮助我们映射state中的数据为计算属性 computed: {//借助mapState生成计算属性:sum.school.subject(对象写法)...mapSt ...

  3. dart中list的map方法获取index

    dart map获取index 只需要index list.asMap().keys.map((index) { return something; } List<String> list ...

  4. java 8 string_String.join() --Java8中String类新增方法

    /*** Returns a new String composed of copies of the * {@codeCharSequence elements} joined together w ...

  5. java8中的map与flatmap区别

    map:只能返回一个值 flatmap:返回多个值 new ArrayList().stream().map(x -> x);//返回一个 new ArrayList().stream().fl ...

  6. 通过stream去重_分享几种 Java8 中通过 Stream 对列表进行去重的方法

    几种列表去重的方法 在这里我来分享几种列表去重的方法,算是一次整理吧,如有纰漏,请不吝赐教.1. Stream 的distinct()方法 distinct()是Java8中 Stream 提供的方法 ...

  7. 如何正确的使用Java8中的Optional类来消除代码中的null检查

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:一书生VOID lw900925.github.io/jav ...

  8. python3.x pool.map方法的实质

    我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法.下面写一个简单的示例和解析.至于此种方法使用多进程的效率问题,还希望大佬予以指正. 示例: "&q ...

  9. 使用Java8中的Optional类来消除代码中的null检查

      作者:一书生VOID lw900925.github.io/java/java8-optional.html Optional类是Java 8新增的一个类,用以解决程序中常见的NullPointe ...

最新文章

  1. html表格标签模板 实现跨行和跨列
  2. dp线长什么样子_怎么样选择好的DP线?
  3. 《可爱的Python》读书笔记(五)
  4. windows下解决mysql5中文乱码的问题
  5. [BZOJ2616] SPOJ PERIODNI
  6. SRTP参数及数据包处理过程
  7. 基础知识(十二)Opengl回顾记录
  8. JVM GC日志说明
  9. 《X战警:黑凤凰》国内票房破2亿 口碑却落了《复联4》一大截
  10. 原生ajax的post方法,原生js实现ajax及get post方法
  11. 火星人谚语系列之三:正确的答案一定简单
  12. redis入门(转)
  13. android 时钟旋转动画,抖音上超火的时间轮盘时钟轮盘八卦太极动态壁纸软件分享安卓苹果都可以设置!...
  14. IDea更改主题和部分修改主题方法
  15. Windows10系统封装
  16. 重庆市企业数据名录爬取采集-信用中国(重庆)
  17. 【围棋游戏——使用Python实现(纯tkinter gui)】
  18. t420i升级固态硬盘提升_surface laptop3固态升级指南——拆机、换固态硬盘、重装系统...
  19. 一文搞定 | Linux 网络子系统
  20. nlp中的实体关系抽取方法总结

热门文章

  1. 蓝桥杯 入门训练 圆的面积
  2. 例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
  3. FFmpeg解码音频代码
  4. 第二十三:Appium+Pytest实现app并发测试
  5. bitlocker密钥输入后一直没用_win10系统bitlocker解锁后如何上锁
  6. matlab tolx,Nelder-Mead算法matlab
  7. Jenkins 插件安装方式全攻略
  8. FTP 编写 3:同时为多个客户端服务(多线程)
  9. php什么版本好玩_PHP各种版本区别对比详解
  10. 测试通用串行总线控制器好坏软件,通用串行总线控制器出现叹号是什么情况?怎么解决?...