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