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

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](因为隐含),我在该类型中看不到任何点.

解决方法

So,if we invoke flatMap on a List[A] we will get the List[A] and I don’t
see any point in That type if it will always be deduced to 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)

(编辑:李大同)

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

    推荐文章
      热点阅读