Java: Java8中stream Collectors.toMap将List转为Map

简介: Java: Java8中stream Collectors.toMap将List转为Map

作用:

  • Collectors.toMap将List转为Map

定义

public final class Collectors {
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }
    public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }
}

使用示例

定义 User类

package com.github.mouday.demo;
public class User {
    private Integer id;
    private String name;
    private Integer age;
    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    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 getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

toMap 使用示例

package com.github.mouday.demo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
                new User(1, "Tom", 20),
                new User(2, "Jack", 30),
                new User(3, "Steve", 40)
        );
        // id作为key, user对象作为value
        // Function.identity() 等价于 t -> t
        Map<Integer, User> collect = users.stream()
                .collect(Collectors.toMap(User::getId, Function.identity()));
        System.out.println(collect);
        // {
        //    1=User{id=1, name='Tom', age=20},
        //    2=User{id=2, name='Jack', age=30},
        //    3=User{id=3, name='Steve', age=40}
        // }
        // id作为key, name作为value
        Map<Integer, String> collect1 = users.stream()
                .collect(Collectors.toMap(User::getId, User::getName));
        System.out.println(collect1);
        // {1=Tom, 2=Jack, 3=Steve}
    }
}

如果key重复,会报错

Exception in thread "main" java.lang.IllegalStateException: 
Duplicate key User{id=1, name='Tom', age=20}

如果key键重复,我们取后者

package com.github.mouday.reggie;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
                new User(1, "Tom", 20),
                new User(2, "Jack", 30),
                new User(3, "Steve", 40),
                new User(1, "Judi", 50)
        );
        // id作为key, user对象作为value
        // Function.identity() 等价于 t -> t
        Map<Integer, User> collect = users.stream()
                .collect(Collectors.toMap(User::getId, Function.identity(), (n1, n2) -> n2));
        System.out.println(collect);
        // {
        // 1=User{id=1, name='Judi', age=50},
        // 2=User{id=2, name='Jack', age=30},
        // 3=User{id=3, name='Steve', age=40}
        // }
        // id作为key, name作为value
        Map<Integer, String> collect1 = users.stream()
                .collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n2));
        System.out.println(collect1);
        // {1=Judi, 2=Jack, 3=Steve}
    }
}


相关文章
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
287 18
你对Collection中Set、List、Map理解?
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
545 20
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
930 2
Java Stream中peek和map不为人知的秘密
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
206 5
|
存储 算法 Java
Stream很好,Map很酷,但答应我别滥用toMap()!
【8月更文挑战第27天】在Java的世界里,Stream API和Map数据结构无疑是现代编程中的两大瑰宝。Stream API以其函数式编程的优雅和强大的数据处理能力,让集合操作变得简洁而高效;而Map则以其键值对的存储方式,为数据的快速检索和更新提供了便利。然而,当这两者相遇,特别是当我们试图通过Stream的toMap()方法将流中的元素转换为Map时,一些潜在的问题和陷阱便悄然浮现。今天,我们就来深入探讨一下这个话题,并探讨如何更加安全、高效地利用这些强大的工具。
329 0
|
存储 Java 索引
Java 中 List、Set、Map 和 Queue 之间的区别
【8月更文挑战第22天】
678 0
|
安全 Java 数据库连接
让我们讲解一下 Map 集合遍历的方式
我是小假 期待与你的下一次相遇 ~
422 43
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set