在Java8中收集到HashMap到LinkedHashMap的数据
我正在使用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
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)