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这三个参数。

目录
相关文章
|
5天前
|
存储 安全 Java
Java基础之集合Map
【7月更文挑战第8天】Java中的Map集合以键值对方式存储数据,如`Map&lt;&quot;name&quot;, &quot;张三&quot;&gt;`。Map接口定义了存取、判断、移除等操作,包括`put`、`get`、`containsKey`等方法。HashMap是最常用的实现,基于哈希表,允许null键值,但不保证顺序。其他实现包括同步的Hashtable、处理属性文件的Properties、保持插入顺序的LinkedHashMap、基于红黑树的TreeMap、弱引用的WeakHashMap、并发安全的ConcurrentHashMap和针对枚举优化的EnumMap。
11 4
|
14天前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
6天前
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估
|
6天前
|
存储 安全 Java
Java Map集合:选择正确的实现方式
Java Map集合:选择正确的实现方式
|
10天前
|
Java
java lab 8------7-1 sdut-JAVA-a contacts list(s)(multi-arraylists)
java lab 8------7-1 sdut-JAVA-a contacts list(s)(multi-arraylists)
8 0
|
12天前
|
存储 缓存 安全
Java List操作详解及常用方法
Java List操作详解及常用方法
|
12天前
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估
|
12天前
|
Java 数据处理 Apache
使用Java构建实时流处理应用的技术选型
使用Java构建实时流处理应用的技术选型
|
14天前
|
Java
Java Map.Entry接口详解
Java Map.Entry接口详解
|
17天前
|
存储 安全 程序员
老程序员分享:List、Map、Set之间的联系与区别:
老程序员分享:List、Map、Set之间的联系与区别: