如何修改Collectors.toMap调用代码以返回LinkedHashMap并维持顺序
解决方法:返回LinkedHashMap并维持原顺序
你需要调整Collectors.toMap()的调用方式,因为默认的实现会返回HashMap,既不保证顺序也不是你要的LinkedHashMap类型。这里直接用重载版本指定Map的类型和顺序:
return this.subjects.entrySet().stream() .collect(Collectors.toMap( e -> getArtistryCopy(e.getKey()), Map.Entry::getValue, // 处理重复key的逻辑,原LinkedHashMap无重复key时,用这个就够了 (existing, newVal) -> existing, // 指定创建LinkedHashMap来保留顺序 LinkedHashMap::new ));
关键细节说明
- 原代码使用的
Collectors.toMap()双参数版本,默认返回HashMap——它不维护元素的插入顺序,也不是你需要的类型。 - 第三个参数是合并函数:因为你的
this.subjects是LinkedHashMap,key本身是唯一的,所以这里直接保留原有值即可;如果想更严谨地避免重复key问题,可以替换成抛出异常的逻辑:(x, y) -> { throw new IllegalStateException("Duplicate key found: " + x); }。 - 第四个参数
LinkedHashMap::new是核心:它告诉collect方法要生成LinkedHashMap实例,而LinkedHashMap会严格按照流的处理顺序(也就是原this.subjects的元素顺序)保存数据,完美满足你维持原有顺序的需求。
这样修改后,返回的结果就是LinkedHashMap<AbstractArtistry, ArrayList<AbstractCommand>>,完全符合你的要求~
内容的提问来源于stack exchange,提问作者John Lexus
相关产品推荐
相关产品推荐

