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

scala – 地图展平和平面图不相同

发布时间:2020-12-16 09:28:40 所属栏目:安全 来源:网络整理
导读:我以为 Scala construct map(f).flatten was equivalent to flatMap(f) .但是通过这个例子,情况并非如此.我想知道案例类的作用是什么.如果我使用整数,两者都是等价的.但就我而言,我不能. case class CTest(v: Int)val s = Set(Map(CTest(0) - List(0,3),CTes
我以为 Scala construct map(f).flatten was equivalent to flatMap(f).但是通过这个例子,情况并非如此.我想知道案例类的作用是什么.如果我使用整数,两者都是等价的.但就我而言,我不能.

case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0,3),CTest(1) -> List(0,2)))
val possibilities = s flatMap { m =>
  val mapping = m flatMap {
    case (label,destNodes) => destNodes map {
      case nodes => (label,nodes) }
  }
  mapping
}
possibilities

产量

Set((CTest(0),(CTest(1),2))

case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0,2)))
val possibilities = s flatMap { m =>
  val mapping = m map {
    case (label,nodes) }
  }
  mapping.flatten
}
possibilities

产量

Set((CTest(0),0),(CTest(0),2))

知道为什么吗?

解决方法

看一下flatMap的实现:

def flatMap[B,That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Repr,B,That]): That = {
  def builder = bf(repr) // extracted to keep method size under 35 bytes,so that it can be JIT-inlined
  val b = builder
  for (x <- this) b ++= f(x).seq
  b.result
}

flatMap的结果取决于函数f的原始集合类型和结果类型.在第一个示例中,您从map生成元组序列,以便编译器选择CanBuildFrom [Map [A??,B],(C,D),Map [C,D]]的实现,它提供Map的构建器,导致覆盖相同的钥匙.

您可以直接将map转换为plain iterable,这将产生您想要的结果:

case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0,2)))
val possibilities = s flatMap { m =>
  val mapping = m.toIterable.flatMap {
    case (label,nodes) }
  }
  mapping
}
possibilities

(编辑:李大同)

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

    推荐文章
      热点阅读