scala – Iterables的映射 – 在给定键下将值添加到iterable的通
发布时间:2020-12-16 09:06:19 所属栏目:安全 来源:网络整理
导读:我可以为Vectors编写以下内容: def add[K,V](map: Map[K,Vector[V]],key: K,values: Vector[V]): Map[K,Vector[V]] = { map + (key - (map.getOrElse(key,Vector.empty) ++ values))} 用法: scala add(Map(1 - Vector(1,2,3)),1,Vector(4,5,6))res1: Map[I
我可以为Vectors编写以下内容:
def add[K,V](map: Map[K,Vector[V]],key: K,values: Vector[V]): Map[K,Vector[V]] = { map + (key -> (map.getOrElse(key,Vector.empty) ++ values)) } 用法: scala> add(Map(1 -> Vector(1,2,3)),1,Vector(4,5,6)) res1: Map[Int,Vector[Int]] = Map(1 -> Vector(1,3,4,6)) 集的代码几乎相同: def add[K,Set[V]],values: Set[V]): Map[K,Set[V]] = { map + (key -> (map.getOrElse(key,Set.empty) ++ values)) } 如何制作适用于所有Iterables的单一功能?我试着像这样写: def add[K,Iterable[V]],values: Iterable[V]): Map[K,Iterable[V]] = { map + (key -> (map.getOrElse(key,Iterable.empty) ++ values)) } 但在这种情况下,我丢失了类型信息: scala> add(Map(1 -> Set(1,Set(4,6)) res4: Map[Int,Iterable[Int]] = Map(1 -> Set(5,6,4)) 我尝试了以下方法: def add[K,V,I[_] <: Iterable[_]](map: Map[K,I[V]],values: I[V]): Map[K,I[V]] = { map + (key -> (map.get(key).map(_ ++ values).getOrElse(values))) } 但它没有编译:
解决方法
您需要使用CanBuildFrom通过调用来传递有关已使用集合的类型信息.请参阅TraversableLike上的重载.
以下工作(不关心细节,如未定义的键). def add[K,It <: TraversableLike[V,It]] (map: Map[K,It],k: K,vs: Traversable[V]) (implicit bf: CanBuildFrom[It,It]) :Map[K,It] = map + (k -> (map(k) ++ vs)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |