gpt4 book ai didi

scala - 我是否必须创建一个新对象来混合 Scala 特征?

转载 作者:行者123 更新时间:2023-12-04 15:16:19 24 4
gpt4 key购买 nike

在 Scala 中,调用 groupBy()在集合上返回 Map其中值是集合,但我想要一个 MultiMap .进行转换的最简单方法是什么?我可以避免创建一个新的 MultiMap并复制所有内容?

最佳答案

我认为答案是“我是否必须创建一个新对象来混合 Scala 特征?”是是的”。您可以通过包装对象和隐式转换来最大程度地减少痛苦。

对于您的具体问题,我无法强制 groupBy(...) 将可变映射返回到可变集,您需要使用“MapProxy with MultiMap”将其包装起来。但是,实现您自己的“groupBy”版本并没有太多代码行:

package blevins.example

object App extends Application {

implicit def multiMapable[B](c: Iterable[B]) = new {
def groupByMM[A](f: B => A) = {
import scala.collection.mutable._
val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
for (e <- c) { ret.addBinding(f(e), e) }
ret
}
}

val c = List(1,2,3,4,5,6,7,8,9)
val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
mm.addBinding("alpha",12)
println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))

}

附录

这是将现有 Map[String,Set[Int]] 包装到 MultiMap 而不复制值的示例:
object App extends Application {
import scala.collection.mutable._
val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))

val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
val self = seed
}

multiMap.addBinding("even", 8)
println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}

请注意,这不能在 groupBy(...) 的结果上完成,因为种子映射需要是可变的,而 groupBy(...) 返回一个不可变的映射。

关于scala - 我是否必须创建一个新对象来混合 Scala 特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com