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

Scala:map flatten和flatmap不等同

发布时间:2020-12-16 09:11:27 所属栏目:安全 来源:网络整理
导读:我以为 scala construct map(f).flatten was equivalent to flatMap(f) .但是就这个例子而言,情况并非如此.我不知道案例类在其中的作用是什么.如果我使用整数,两者都是等效的.但在我的情况下,我不能. case class CTest(v: Int)val s = Set(Map(CTest(0) - Li
我以为 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提供了构建器,导致覆盖相同的键

您可以直接将地图转换为纯迭代,这将产生您想要的结果:

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

(编辑:李大同)

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

    推荐文章
      热点阅读