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

目录
相关文章
|
29天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
39 0
|
2天前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
8 0
|
3天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
15天前
|
存储 算法 安全
Java Map:键值对的奇妙之旅
Java Map:键值对的奇妙之旅
42 0
Java Map:键值对的奇妙之旅
|
26天前
|
Java
Java使用List去重的四中方式
Java使用List去重的四中方式
19 6
|
30天前
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
18 0
|
1月前
|
Java
JAVA——List中剔除空元素(null)的三种方法汇总
JAVA——List中剔除空元素(null)的三种方法汇总
如何使用Stream流将List转换为Map
如何使用Stream流将List转换为Map
|
1月前
|
安全 Java API
Java并发 - J.U.C并发容器类 list、set、queue
Queue API 阻塞是通过 condition 来实现的,可参考 Java 并发 - Lock 接口 ArrayBlockingQueue 阻塞 LinkedBlockingQueue 阻塞 ArrayQueue 非阻塞 LinkedQueue 非阻塞
|
1月前
|
存储 安全 Java
【Java】集合(三)Map
【Java】集合(三)Map
20 0