在 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]]
,它正确地表示结果可以是单个元素、一对或三个。
我有 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]]
,它正确地表示结果可以是单个元素、一对或三个。