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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |