我们将对这个List使用java8的strea中的toMap转换成Map对象。
toMap有个三个重载的方法,toConcurrentMap同理:
两个参数
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
三个参数
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
四个参数
public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
- keyMapper:Key 的映射函数
- valueMapper:Value 的映射函数
- mergeFunction:当 Key 冲突时,调用的合并方法
- mapSupplier:Map 构造器,在需要返回特定的 Map 时使用
指定key-value,value是对象中的某个值,key是String类型的organCode,值是Integer类型的type
指定key-value,value是当前对象
指定key-value,value是当前对象
这里的Function.identity()是对传入一个对象,并原封不动的返回的是个简法。
指定key-value,value是当前对象的Map类型
指定key-value,解决key冲突
当key值相等时(冲突),toMap默认是抛出异常
使用(k1, k2)-> k2,就是发生冲突,只保留后面那个元素。
这里我们返回了List<Organ> ,并且冲突时进行了合并,这里和groupingBy的效果是一样的