scala – 了解List中的flatMap声明
发布时间:2020-12-16 09:57:00 所属栏目:安全 来源:网络整理
导读:我只是查看了List.flatMap声明,并对此感到惊讶. final override def flatMap[B,That](f: A = GenTraversableOnce[B]) (implicit bf: CanBuildFrom[List[A],B,That]): That 对象列表定义的位置: implicit def canBuildFrom[A]: CanBuildFrom[Coll,A,List[A]]
我只是查看了List.flatMap声明,并对此感到惊讶.
final override def flatMap[B,That](f: A => GenTraversableOnce[B]) (implicit bf: CanBuildFrom[List[A],B,That]): That 对象列表定义的位置: implicit def canBuildFrom[A]: CanBuildFrom[Coll,A,List[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]] 因此,如果我们在List上调用flatMap,我们将得到List,如果它总是被推导到List [B](因为隐含),我在该类型中看不到任何点. 解决方法
你遗漏的一件事是flatMap实际上并没有在List [A]上定义.它继承自TraversableLike,这是大多数Scalas集合使用的特征.它们中的每一个都可以提供隐式CanBuildFrom,可以覆盖它以提供不同的结果集合. 如果您想了解使用自定义CanBuildFrom可以做些什么: scala> :pa // Entering paste mode (ctrl-D to finish) import scala.collection.generic.CanBuildFrom import scala.collection.immutable._ import scala.collection.mutable import scala.{List,Vector} implicit val listToVectorCBF = new CanBuildFrom[List[Int],Int,Vector[Int]] { override def apply(from: List[Int]): mutable.Builder[Int,Vector[Int]] = this.apply() override def apply(): mutable.Builder[Int,Vector[Int]] = Vector.newBuilder } // Exiting paste mode,now interpreting. scala> List(1,2,3).flatMap(List(_)) res6: Vector[Int] = Vector(1,3) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |