jadestoner

导航

 

toMap

list.stream().collect(Collectors.toMap(bean::getKey, value->value));

Map<Integer, AAA> map = list.stream().collect(Collectors.toMap(AAA::getA, t->t, (v1, v2)->v2, LinkedHashMap::new));

看着一堆lamdba表达式,好像很难,其实很简单,api doc里各个参数的意义已经写的十分清楚了

下面简单讲解下:

Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {

keyMapper:让你提供一个获取key的lambda, 即 AAA::getA
valueMapper:让你提供一个获取key的lambda,即e->e,原封不动的返回对象,也可以自己操作,
mergeFunction :当遇到key冲突时的处理策略,(v1, v2)->v2,当冲突时,取后面的值覆盖前面的值,
mapSupplier: 让你提供一个获取map的lambda,即LinkedHashMap::new

坑1 ,

直接使用 Collectors.toMap() 的话,有一个坑,就是 value 不能为 null,否则会报 NPE

可以参考这篇博客:
https://blog.csdn.net/weixin_41905537/article/details/105864504

解释一下这几个参数的意思:

    <R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

supplier: map提供器,常用HashMap::new或者LinkedHashMap::new,也可以是别的自定义的map

accumulator:数据收集器,注意第一个参数是范型R,是第一个参数supplier,提供出来的,即是一个map类型,第二个参数,就是list的item了,
常见用法:(map, e) -> map.put(e.getId(),e)。将list的每个数据,以id为key,本身为value,塞入到map中

combiner:数据组合器

stream 中peek和 map的区别

map可以改变返回值类型,而peek可修改数据,无法改变返回值类型

posted on 2021-01-12 15:35  jadestoner  阅读(151)  评论(0编辑  收藏  举报