Java8中list转map方法总结_jdk8list转map把某个值当key_小苗欧巴的博客-程序员秘密

技术标签: java8新特性  list  数据结构  

背景
在最近的工作开发之中,慢慢习惯了很多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));
}

其中第一个参数就是可以,第二个参数就是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));

}


3.用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());
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/miaoye520/article/details/122586801

智能推荐

tensorflow 进阶(四)---CNN_luoganttcc的博客-程序员秘密

#!/usr/bin/env python3# -*- coding: utf-8 -*-&amp;quot;&amp;quot;&amp;quot;Created on Thu Mar 22 22:15:25 [email protected]: luogan&amp;quot;&amp;quot;&amp;quot;from tensorflow.examples.tutorials.mnist import input_datamnist=input_data.re

CCNA学习笔记七 DTE广域网(PPP)WAN_catkint的博客-程序员秘密

长距离传输DTE 和DCE网线:串口Router上面》》DTE:带有链接广域网线路端口的用户端设备Modem上面》》DCE:广域网提供商的末端通信设备PPPoE::在以太网上使用广域网的协议DTE::配置时钟,   发送数据的频率DCE ::配置时钟专线链接:稳定,速率低   64k  128k  256k........独享的,预先建立好了的广域网通信通道

WPF的颜色选择器_wpf颜色选择器_海浪~的博客-程序员秘密

System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){System.Drawing.SolidBrush sb=new Sys...

AT91RM9200引导程序的建立(三)--------U-Boot1.1.4在AT91RM9200上的移植_u-boot 1.1.4--clean_张志龙的博客-程序员秘密

  BootLoader概述       Boot Loader就是在操作系统内核运行之前运行的一段小程序。通过这段BootLoader,我们来初始化硬件设备,为硬件设备准备地址空间,中断号等,建立内存空间的映射,从而将系统的软硬件环境带到一个合适的状态。AT91RM9200处理器启动有两种情况,一种是从外部启动,如Flash,EEPROM,DATAFLASH等;一种是从内部的BOOT

docker容器CPU核心限制(绑定内核)_docker 绑核_ultralinux的博客-程序员秘密

多核CPU的服务器Docker还可以控制容器运行限定使用哪些CPU内核,可以使用--cpuset-cpus选项来使某些程序独享CPU核心,以便提高其处理速度,对应的Cgroup文件为/sys/fs/cgroup/cpuset/docker/容器ID号/cpuset.cpus。选项后直接跟参数0、1、2……表示第1个内核,第2个内核,第3个内核,与/proc/cpuinfoo中的标号相同。使新建容器绑定第1~4的核心使用docker run -itd --cpuset-cpus 0,1,2,3

Email-FTP-RTSP协议实践研究669_胖胖的马尔扎哈的博客-程序员秘密

一.Email应用编程1.SMTP协议SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。  SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 

随便推点

【蓝桥杯省赛JavaB组真题详解】分小组(2016)_2016年蓝桥杯分小组_疼疼蛇的博客-程序员秘密

题目描述分小组9名运动员参加比赛,需要分3组进行预赛。有哪些分组的方案呢?我们标记运动员为 A,B,C,… I下面的程序列出了所有的分组方法。该程序的正常输出为:ABC DEF GHIABC DEG FHIABC DEH FGIABC DEI FGHABC DFG EHIABC DFH EGIABC DFI EGHABC DGH EFIABC DGI EFHABC DHI EFGABC EFG DHIABC EFH DGIABC EFI DGHABC EGH DFI

项目中常用的D3D黑屏优化讲解和源码分享,DX系列的游戏都可以用_黑屏优化d3d9_微尘网络安全的博客-程序员秘密

诸多工作室在项目测试功能稳定后,为了更高效率的 榨干电脑性能 尽可能的多开会选择将画面黑屏,零渲染!!今天我们来拆解分析实现原理和方案 大部分游戏画面渲染基本用的都是DX系列 除了DX9 现在很多游戏也用到了DX11 他们版本有差异 在逆向程序员眼里区别不大。通过OD就可以查看游戏加载 了哪些模块,很多游戏都有加载d3d9.dll或者d3d11.dll 这也说明了 他们在正向开发过程中用到了 D3D进行了渲染。所以 也就可以在这些模块 里HOOK 劫持修改他的渲染函数 在...

三、机器学习基本概念_机器学习定义arthur的阐释_开水里的鱼1105的博客-程序员秘密

机器学习基本概念训练集测试集特征值监督学习非监督学习半监督学习分类回归

SPOJ - SUBLEX 后缀自动机_a1214034447的博客-程序员秘密

解题思路:不重复的计算子串很简单,只要记忆化搜索,dp过去求每个节点后面有多少个串,然后用逼近法,去求出那个串就行了。#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;typedef long long ll;const int mx = 2e5 + 10;char str[mx],Ts[mx];struct state{ int fa...

Matplotlib的子图subplot的使用_甄同学的博客-程序员秘密

转载:https://www.jianshu.com/p/de223a79217aMatplotlib的子图subplot的使用 skullfang 关注2018.01.08 16:10 字数 229 阅读 74评论 0喜欢 0前言Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图。这是怎么做到的呢。m

unity3d学习之综合题整理_jingjingcrystal的博客-程序员秘密

unity教程,unity3d教程,更多的知识值得我们学习。1:计算1+3+5+...+99     思路:这道题有两种解法               (1)普通写法:首先定义和为sum,赋值为0;然后根据1+3+5+...+99可以得出通式为2*n+1,或者2*n-1,因为式子是从1开始相加,所以                         选择通式2*n-1;最后

推荐文章

热门文章

相关标签