在Java8中收集到HashMap到LinkedHashMap的数据

在Java8中收集到HashMap到LinkedHashMap的数据,java,java-8,java-stream,Java,Java 8,Java Stream,我正在使用Java8流将HashMap转换为LinkedHashMap。我有以下代码: final LinkedHashMap<String, Employee> collect = map.entrySet().stream() .sorted(Comparator.comparing(o -> o.getValue().getName())) .collect(Collectors.toMap(e -> e.ge

我正在使用Java8流将HashMap转换为LinkedHashMap。我有以下代码:

    final LinkedHashMap<String, Employee> collect = map.entrySet().stream()
            .sorted(Comparator.comparing(o -> o.getValue().getName()))
            .collect(Collectors.toMap(e -> e.getKey(), v -> v.getValue(), (o, o2) -> o, LinkedHashMap::new));
据我所知,这是一个二进制运算符,但我无法确切理解它是如何工作的,以及“o”对于
o,LinkedHashMap::new的含义

有谁能帮我理解它或者用什么更好的方法来实现这一点吗?

(o,o2)->o
是第三个参数

正如文件所说

@param mergeFunction合并函数,用于解决冲突 之间 *与提供的相同键关联的值 *到{@linkmap#合并(对象,对象,双函数)}


这意味着,如果存在冲突,则只保留
o
。您不关心其他冲突对象
o2
。因此,
o
o2
是同一个键存在的两个冲突值。

是否一定要创建这样的
LinkedHashMap
?为什么不喜欢新的LinkedHashMap(map))
?它是一个-这是一个
供应商
。实际上有两个参数:1)
(o,o2)->o
是一个合并函数-在这种情况下是多余的,但需要提供,因为签名;2)
LinkedHashMap::new
-LinkedHashMapmerge函数的供应商用于解决冲突,以便在出现重复键时选择值,
(o,o2)->o
表示保留第一个值。但只要您正在转换现有地图,所有关键点都是唯一的,不会发生任何冲突,因此不应调用此函数。此参数仅作为占位符使用,因为
toMap
不会重载以仅提供
供应商
,因为
groupingBy
收集器具有。@K.Nicholas no,它不允许
null
。但是您可以使用
(o1,o2)->{throw new AssertionError();}
来澄清这个函数永远不应该被求值。优点是,如果这个假设被证明是错误的,您会注意到,而不是默默地删除条目。
(o, o2) -> o, LinkedHashMap::new)