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可修改数据,无法改变返回值类型