加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)))
}

但它没有编译:

Cannot construct a collection of type That with elements of type Any based on a collection of type Repr.
[error] 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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读