收集器中缺少带有键、值和地图供应商的 toMap 方法

use*_*er7 5 java java-8

Collectors.toMap 有三个重载的变体。

1. 键值映射器:

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
Run Code Online (Sandbox Code Playgroud)

2.扩展1添加合并功能:

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
Run Code Online (Sandbox Code Playgroud)

3.用地图供应商扩展2:

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么没有采用关键供应商价值供应商地图供应商的方法

当我想使用不同的映射(HashMap 除外)并且我确定我的键映射函数不会生成重复键时,这将很有用。

为了实现这一点,我要么必须为mergeFunction传递(一个简单的)lambda

persons.stream()
        .collect(Collectors.toMap(Person::getId, Function.identity(),
                (a, b) -> a, 
                LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)

或者,使用 Collectors.collectingAndThen

persons.stream()
        .collect(Collectors.collectingAndThen(Collectors.toMap(Person::getId, Function.identity()),
                LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@Holger 在评论中指出的那样,复制到 aLinkedHashMap将无济于事,因为在通过 toMap 方法填充地图时顺序已经更改

[..]collectingAndThen 没有达到目的,因为将无序映射复制到 LinkedHashMap 之后并不能恢复顺序