未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java 新特性

  • Java8 新特性

    • Java 8 Lambda 和 Comparator 排序
    • Java 8 Optional 介绍
    • Java 8 Lambda 表达式介绍
    • Java 8 Stream 流式操作
    • Java 8 LocalDate、LocalDateTime 时间处理介绍
    • Java 8 List 转 Map
      • 1. Collectors.toMap
      • 2. List 转 Map,冲突 Key
      • 3. List 转 Map,指定 Map 类型
      • 参考
    • Java 8 Function 函数接口
    • Java 8 Supplier 函数接口
    • Java 8 Consumer 函数接口
    • Java 8 Predicate 函数接口
    • Java 8 forEach 遍历
    • Java 8 BiFunction 函数接口
    • Java 8 BiPredicate 函数接口
    • Java 8 UnaryOperator 函数接口
  • Java 新特性
  • Java8 新特性
程序猿阿朗
2021-07-24

Java 8 List 转 Map

这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。

本文介绍从 Java 8 开始,如何把一个 List 转换为 Map,以及如果出现了冲突的 key 该如何处理。

准备:Dog.java

package com.wdbyte.demo;

public class Dog {
    private String name;
    private Integer age;

    public Dog() {
    }

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    // 省略 get set toString
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 1. Collectors.toMap

List 转 Map 可以使用 Java 8 中的 Collectors.toMap 进行转换。

示例1:把包含不同品种的狗类集合转换成 key 为狗的品种,value 为狗的年龄的 Map。

package com.wdbyte.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ListToMap {

    public static void main(String[] args) {
        List<Dog> list = new ArrayList<>();
        list.add(new Dog("牧羊犬", 1));
        list.add(new Dog("哈士奇", 2));
        list.add(new Dog("田园犬", 3));

        // to map,key dog name,value ,dog age
        Map<String, Integer> dogMap = list.stream()
            .collect(Collectors.toMap(Dog::getName, Dog::getAge));

        System.out.println(dogMap);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

输出结果:

{牧羊犬=1, 哈士奇=2, 田园犬=3}
1

示例2:把包含不同品种的狗类集合转换成 key 为狗的品种,value 为狗的信息对象的 Map。

List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));

// to map,key dog name,value ,dog age
Map<String, Dog> dogMap = list.stream()
    .collect(Collectors.toMap(Dog::getName, dog -> dog));

System.out.println(dogMap);
1
2
3
4
5
6
7
8
9
10

输出结果:

{牧羊犬=Dog{, name='牧羊犬', age=1}, 哈士奇=Dog{, name='哈士奇', age=2}, 田园犬=Dog{, name='田园犬', age=3}}
1

# 2. List 转 Map,冲突 Key

还是上面的例子,如果有重复的 key 将会抛出异常。

示例1:List 转 Map 使用 Collectors.toMap 进行转换时,如果有 key 冲突。

package com.wdbyte.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ListToMapDuplicateKey {

    public static void main(String[] args) {
        List<Dog> list = new ArrayList<>();
        list.add(new Dog("牧羊犬", 1));
        list.add(new Dog("牧羊犬", 2));
        list.add(new Dog("哈士奇", 2));
        list.add(new Dog("田园犬", 3));

        // to map,key dog name,value ,dog age
        Map<String, Integer> dogMap = list.stream()
            .collect(Collectors.toMap(Dog::getName, Dog::getAge));

        System.out.println(dogMap);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

输出结果:在遇到重复 key 时,抛出了异常。

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 牧羊犬 (attempted merging values 1 and 2)
	at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:133)
	at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:180)
	at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	...
	
1
2
3
4
5
6

示例2:传入第三个参数,当Key 冲突时,选择使用新值。

List<Dog> list = new ArrayList<>();
list.add(new Dog("牧羊犬", 1));
list.add(new Dog("牧羊犬", 2));
list.add(new Dog("哈士奇", 2));
list.add(new Dog("田园犬", 3));

// to map,key dog name,value ,dog age
Map<String, Integer> dogMap = list.stream()
    .collect(Collectors.toMap(Dog::getName, Dog::getAge, (oldData, newData) -> newData));

System.out.println(dogMap);
1
2
3
4
5
6
7
8
9
10
11

通过 (oldData, newData) -> newData) 来选择使用新值还是老值。

输出结果:

{牧羊犬=2, 田园犬=3, 哈士奇=2}
1

# 3. List 转 Map,指定 Map 类型

示例:传入第四个参数,指定 Map 类型。

public static void main(String[] args) {
     List<Dog> list = new ArrayList<>();
     list.add(new Dog("牧羊犬", 1));
     list.add(new Dog("牧羊犬", 2));
     list.add(new Dog("哈士奇", 2));
     list.add(new Dog("田园犬", 3));

     // to map,key dog name,value ,dog age
     Map<String, Integer> dogMap = list.stream()
         .collect(Collectors.toMap(Dog::getName, Dog::getAge, 
                                   (oldData, newData) -> newData,
                                   ConcurrentHashMap::new));
     System.out.println(dogMap.getClass());
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

输出结果:

class java.util.concurrent.ConcurrentHashMap
1

# 参考

  • Collectors (Java Platform SE 8 ) (opens new window)

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/java8/java8-list-to-map/
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#Java8#List#Map
上次更新: 2022/12/05, 08:18:32
Java 8 LocalDate、LocalDateTime 时间处理介绍
Java 8 Function 函数接口

← Java 8 LocalDate、LocalDateTime 时间处理介绍 Java 8 Function 函数接口→

最近更新
01
如何搭建一个自己的音乐服务器
12-04
02
JUnit 5 单元测试教程
11-17
03
使用 StringUtils.split 的坑
11-02
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式