在 scala 中合并 3 个不可变映射

Merging 3 immutable maps in scala

我有 3 个不可变映射

as: Map[UUID, A]
bs: Map[UUID, B]
cs: Map[UUID, C]

我想合并它们所以结果的类型是:

Map[UUID, (Option[A], Option[B], Option[C])]

执行此操作的最佳方法是什么。最好是指最少的代码行。

也许你可以用来理解:

for {
  k <- as.keySet ++ bs.keySet ++ cs.keySet
} yield (as.get(k), bs.get(k), cs.get(k))

我认为您需要迭代所有键并为每个键构造值。像这样:

val keys = as.keySet ++ bs.keySet ++ cs.keySet
val merged = keys.map(key => (key, (as.get(key), bs.get(key), cs.get(key)))).toMap

理想情况下,您需要一种更好的数据类型,它知道至少必须定义一个元素。既然你提到了 cats 你可以这样做:

import cats.syntax.all._

val result = ((as align bs) align cs)

这给你一个 Map[UUID, Ior[Ior[A, B], C]],它正确地表示结果可以是单个元素、一对或三个。