我感兴趣的是 Scala 是否提供了操作异构集合的便捷方法?
特别是变体类型和多键多映射。
我知道第一个可以构建在嵌套的 Either 类之上 Either[Either[A, B], C]
,第二个可以构建在嵌套的 Map 类之上 Map[A, Map[B, Set[C]]]
,但是每次需要时直接执行更新/删除操作似乎太复杂了(而且我经常需要它们)。
所以我正在寻找一个现成的解决方案。或者也许标准库中有一种方便简单的方法?不管怎样,如果你能给第三方框架提供建议,那也是可以的。
最佳答案
Scala 不提供使异构集合易于管理的工具。
您应该使用shapeless,而不是使用复杂的Either
嵌套,您可以在其中选择可能没有意义的特定树结构。 ' HList
。我不确定你会认为这很容易,但它肯定比Either
树更紧凑(一旦你学习了足够的无形魔法)。
我熟悉的任何通用库都不支持多键映射。此类映射有很多可能的选择:键是分层的还是冗余的?对称查找是否重要(即,如果您有 A
key ,则可以获得映射 B => C
;如果您有 A => C
,则可以获得映射 B => C
有 B
键)?我只想指出,编写一个包装器并不难,该包装器使您能够在您喜欢的任何形式的多键映射上定义自己的方法。您可能必须编写自己的包装器才能获得您想要的行为。最简单的就是提供 2 元包含以及获取和更新方法:
implicit class NestedMapAs2Map[A, B, C](val m: Map[A, Map[B, C]]) extends AnyVal {
def contains2(a: A, b: B): Boolean = m.get(a).exists(_ contains b)
def get2(a: A, b: B): Option[C] = m.get(a).flatMap(_.get(b))
def updated2(a: A, b: B, c: C) = m.updated(a, m.get(a).map(mi => mi.updated(b,c)).getOrElse(Map(b -> c)))
}
关于Scala 增强集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926705/