1.创建Person类

package com.xkzhangsan.normal.collectors;

public class Person {

    private Integer id;
private String name;
private Integer score;
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 Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
} @Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", score=" + score + "]";
} }

2.创建测试类ListToMap

package com.xkzhangsan.normal.collectors;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors; public class ListToMap { public static void main(String[] args) {
//创建list
List<Person> personList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Person p = new Person();
p.setId(i);
p.setName("p"+i);
p.setScore(i*10);
personList.add(p);
} //添加和id=8相同对象score值不同
Person p = new Person();
p.setId(8);
p.setName("p"+8);
p.setScore(88);
personList.add(p); System.out.println("list:========================");
personList.stream().forEach(System.out::println); //转换为HashMap
Map<Integer, Person> map = personList.stream().collect(Collectors.toMap(Person::getId, d->d, (oldValue, newValue)->newValue));
System.out.println("hashMap:========================");
map.entrySet().stream().forEach(System.out::println); //转换为TreeMap
Map<Integer, Person> treeMap = personList.stream().collect(Collectors.toMap(Person::getId, d->d, (oldValue, newValue)->newValue, TreeMap::new));
System.out.println("treeMap:========================");
treeMap.entrySet().stream().forEach(System.out::println);
} }

3.测试结果

list:========================
Person [id=0, name=p0, score=0]
Person [id=1, name=p1, score=10]
Person [id=2, name=p2, score=20]
Person [id=3, name=p3, score=30]
Person [id=4, name=p4, score=40]
Person [id=5, name=p5, score=50]
Person [id=6, name=p6, score=60]
Person [id=7, name=p7, score=70]
Person [id=8, name=p8, score=80]
Person [id=9, name=p9, score=90]
Person [id=8, name=p8, score=88]
hashMap:========================
0=Person [id=0, name=p0, score=0]
1=Person [id=1, name=p1, score=10]
2=Person [id=2, name=p2, score=20]
3=Person [id=3, name=p3, score=30]
4=Person [id=4, name=p4, score=40]
5=Person [id=5, name=p5, score=50]
6=Person [id=6, name=p6, score=60]
7=Person [id=7, name=p7, score=70]
8=Person [id=8, name=p8, score=88]
9=Person [id=9, name=p9, score=90]
treeMap:========================
0=Person [id=0, name=p0, score=0]
1=Person [id=1, name=p1, score=10]
2=Person [id=2, name=p2, score=20]
3=Person [id=3, name=p3, score=30]
4=Person [id=4, name=p4, score=40]
5=Person [id=5, name=p5, score=50]
6=Person [id=6, name=p6, score=60]
7=Person [id=7, name=p7, score=70]
8=Person [id=8, name=p8, score=88]
9=Person [id=9, name=p9, score=90]

4.注意事项

(1)list转map要注意重复对象,map转换方法要选择带mergeFunction参数的方法,如果key值重复,做合并处理,不然会抛异常!可以做到去重效果。

比如上面故意添加和id=8相同对象score为88,值不同。在map转换方法mergeFunction 为(oldValue, newValue)->newValue 使用新对象替换已有老对象,可以看到转换后id8的对象score变为88。

(2)list转map默认转换为HashMap,可以选择带mapSupplier参数的方法,选择要转换为的map类型。

比如上面TreeMap::new,选择转换为TreeMap。

github地址:https://github.com/xkzhangsan/java8-practice

java8使用stream的collect进行list转map注意事项的更多相关文章

  1. java8之stream

    lambda表达式是stream的基础,初学者建议先学习lambda表达式,http://www.cnblogs.com/andywithu/p/7357069.html 1.初识stream 先来一 ...

  2. Java8 Lambda/Stream使用说明

    一.Stream流1. 流的基本概念 1.1 什么是流?流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合.众所周知,集合操作非常麻烦,若要对集合进行筛选.投影,需要 ...

  3. Java8的Stream流(一) --- 基础用法

    Java8中的Stream Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象. Stream的特性及优点: 无存储. Stream不是一种数据 ...

  4. Java8的Stream API使用

    前言 这次想介绍一下Java Stream的API使用,最近在做一个新的项目,然后终于可以从老项目的祖传代码坑里跳出来了.项目用公司自己的框架搭建完成后,我就想着把JDK版本也升级一下吧(之前的项目, ...

  5. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  6. Java8之Stream详解

    Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作.   一.流的初始化与转换   Java中的Stream的所有操作 ...

  7. java8的stream功能及常用方法

    Java8中stream对集合操作做了简化,用stream操作集合能极大程度简化代码.Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后就用尽了. 一. ...

  8. java8中stream的map和flatmap的理解

    转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...

  9. Java8的Stream方法findAny空指针异常(NullPointerException)实例对比

    实战介绍 学习完Java8的Stream方法,可能你正准备大展身手,却发现遇到不少问题,本篇文章为大家带来一个findAny方法抛出java.lang.NullPointerException的场景. ...

随机推荐

  1. xadmin引入django-ckeditor富文本编辑器

    一.安装: pip install django-ckeditor 安装django-ckeditor库 https://github.com/django-ckeditor/django-ckedi ...

  2. python3用turtle库进行绘制小猪佩奇图案

    晚上闲着无事,深入学习这个turtle用法,就做了小猪佩奇图 附上代码: # coding: utf-8 #功能:绘画小猪佩奇 import turtle as t t.screensize(400, ...

  3. contact form 7如何搭配Akismet过滤垃圾邮件

    contact form 7有很多站长在用,但是经常会有一些垃圾邮件进来,如何过滤呢?两个方法:1.表单提交启用验证码功能,很多垃圾邮件是用软件扫相应的端口,然后批量群发,如果用验证码了可以过滤很大一 ...

  4. 24-C#笔记-异常处理

    # 1 语法 try catch finally(相当于catch(...)) using System; ... public void division(int num1, int num2) { ...

  5. js提取DOM属性和设置DOM属性值

    <style type="text/css"> #div1{width:100px;height:100px;} #div2{background} </styl ...

  6. Random Access Iterator 徐州网络赛(树形dp)

    Random Access Iterator \[ Time Limit: 4000 ms \quad Memory Limit: 262144 kB \] 题意 给出伪代码,问按着伪代码在树上跑,能 ...

  7. Pandas | 25 文件读写

    Pandas I/O API是一套像pd.read_csv()一样返回Pandas对象的顶级读取器函数. 读取文本文件(或平面文件)的两个主要功能是read_csv()和read_table().它们 ...

  8. ESA2GJK1DH1K微信小程序篇: 小程序实现MQTT封包源码使用说明

    说明 我为了后期能够快速的让小程序实现MQTT,我做了一个MQTT的封装. 功能的封装有助于后期快速的开发,还方便咱维护. 我后期的所有代码皆使用此封装库, 这一节,我就详细的介绍我封装的MQTT.j ...

  9. 【LG3322】[SDOI2015]排序

    [LG3322][SDOI2015]排序 题面 洛谷 题解 交换顺序显然不影响答案,所以每种本质不同的方案就给答案贡献次数的阶乘. 从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\). ...

  10. Linux上安装git并在gitlab上建立对应的项目

    1.CentOS上面安装git我所用的CentOS为CentOS6.5,其他版本没有测试. yum install git 安装之后查看git版本信息 git --version 2.配置git信息g ...