使用Collectors.toMap返回LinkedHashMap

12

我该如何将这个转换:

return this.subjects.entrySet()
            .stream()
            .collect(Collectors.toMap(e -> getArtistryCopy(e.getKey()), Map.Entry::getValue));

如何返回一个 LinkedHashMap 而不是一个 map?

如果您需要知道,this.subjects 是一个 LinkedHashMap<AbstractArtistries, ArrayList<AbstractCommand>>。AbstractArtistry 和 command 是我创建的两个自定义对象。我需要保持顺序。

getArtistryCopy() 返回 AbstractArtistry(也就是 key)的一个副本。

1个回答

17

您可以使用接受 MapSupplier 参数的重载版本的Collectors.toMap函数。它还接受一个merge函数来解决重复键之间的冲突。

return this.subjects.entrySet()
        .stream()
        .collect(Collectors.toMap(e -> getArtistryCopy(e.getKey()), 
                                  Map.Entry::getValue,
                                  (val1, val2) -> yourMergeResultHere,
                                  LinkedHashMap::new));

4
一个简单的合并函数就是(a, b) -> b,它会覆盖先前的值,就像使用Map.put一样。不过,由于 OP 在映射键,我认为他们可能应该考虑一下他们实际想要用合并函数来做什么。(我认为,人们默认的行为可能是 (a, b) -> b),但是实际上 toMap(Function, Function) 会在遇到重复的键时抛出异常。) - Radiodef
1
@Radiodef 这很合理。对于我的答案,合并函数只是一个想法,因为toMap的唯一重载采用了一个合并函数和一个Supplier - rgettman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接