java8流处理器list转map的对比

简介: java8流处理器list转map的对比


前言

写代码的时候,经常会需要处理拿到的数据,比如把list转成map,就有好多种写法,所以写文章理一下区别。

代码

假设我们有一个实体类User

@Data
public class User{
  private Long id;
  private String name;
  private Integer age;
}

然后先列一下不涉及对象的list转map

1.将List转为Map,key是列表元素,value是索引:

List<String> list = Arrays.asList("a", "b", "c");
Map<String, Integer> map = list.stream().collect(Collectors.toMap(e -> e, list::indexOf));

2.将List转为Map,同时转换元素类型:

List<User> list = getUserList(); 
Map<Integer, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getName));

3.将List转为Map,对象的map,同时还可以过滤或者去重

Map<Integer, User> map = list.stream()
                .filter(u -> u.getAge() > 20)
                .collect(Collectors.toMap(User::getId, u -> u));

4.归组为Map:

Map<String, List<User>> map = list.stream().collect(Collectors.groupingBy(User::getCity));

都很好用,其中我想讨论的是第三种情况,也就是将List转为Map<key,Object>的情况。

我感兴趣的主要是Collectors.toMap()这个toMap里的几种写法

java.util.stream.Collectors类的toMap()方法,是一个非常有用的工具方法,可以将Stream中的元素收集到一个Map中。

Collectors.toMap()方法有以下几个重载版本:

  1. toMap(keyMapper, valueMapper)

最基础的版本,通过两个映射函数分别提取key和value,将元素收集到Map中。例如:

List<User> list = ...; 
Map<Integer, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getName));
  1. toMap(keyMapper, valueMapper, mergeFunction)

这个版本增加了一个mergeFunction参数,用于处理key冲突的情况,当出现重复的key时,会使用这个函数进行处理。

map = list.stream().collect(Collectors.toMap(User::getId, User::getName, (oldValue, newValue) -> newValue));

这里在key冲突时保留新值。

  1. toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)

这个版本额外增加了一个mapSupplier参数,用于指定返回的Map类型,例如:

map = list.stream().collect(Collectors.toMap(User::getId, User::getName, (oldValue, newValue) -> newValue, HashMap::new));

这里指定了使用HashMap。

  1. toMap(keyMapper, valueMapper, mapSupplier)

如果知道key不会冲突,可以只用keyMapper, valueMapper和mapSupplier这三个参数。

目录
相关文章
|
3天前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
Java 中数组Array和列表List的转换
|
3月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
91 18
你对Collection中Set、List、Map理解?
|
3月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
84 20
|
4月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
57 4
|
4月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
86 1
|
5月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
122 5
|
5月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
120 3
|
5月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
192 4
|
5月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
202 3
|
5月前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
116 3