将Map.Entry的List转换为LinkedHashMap

Fai*_*iry 2 java stream java-stream

我有一个List,我需要将它转换为Map但具有相同的键顺序,所以我需要转换为LinkedHashMap.我需要这样的东西:

list.stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

但具体的地图类型,如:

list.stream().collect(Collectors.toCollection(LinkedHashMap::new))
Run Code Online (Sandbox Code Playgroud)

是否有可能将上述两种变体结合起来?

Era*_*ran 8

是的,只需使用Collectors.toMap包含合并功能和地图供应商的变体:

<T, K, U, M extends Map<K, U>> Collector<T, ?, M> java.util.stream.Collectors.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)

使用简单的合并函数(选择第一个值)将如下所示:

LinkedHashMap<KeyType,ValueType> map =
    list.stream().collect(Collectors.toMap(Map.Entry::getKey, 
                                           Map.Entry::getValue,
                                           (v1,v2)->v1,
                                           LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)

  • 但不是`(v1,v2) - > v1`,最好使用`(v1,v2) - > {抛出新的AssertionError("键应该已经是唯一的"); }` (2认同)