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

:::和列表之间有什么区别?

发布时间:2020-12-16 18:42:45 所属栏目:安全 来源:网络整理
导读:给定两个列表a和b,a ::: b和b之间有什么区别?我怀疑其中一个操作符只是调用另一个,但实际上,实现看起来完全不同: def :::[B : A](prefix: List[B]): List[B] = if (isEmpty) prefix else if (prefix.isEmpty) this else (new ListBuffer[B] ++= prefix).pr
给定两个列表a和b,a ::: b和b之间有什么区别?我怀疑其中一个操作符只是调用另一个,但实际上,实现看起来完全不同:

def :::[B >: A](prefix: List[B]): List[B] =
  if (isEmpty) prefix
  else if (prefix.isEmpty) this
  else (new ListBuffer[B] ++= prefix).prependToList(this)

override def ++[B >: A,That](that: GenTraversableOnce[B])
                      (implicit bf: CanBuildFrom[List[A],B,That]): That = {
  val b = bf(this)
  if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That]
  else super.++(that)
}

从使用角度来看,我应该更喜欢::: b还是b?从实施的角度来看,有一个特定的原因,为什么其中一个操作符不会简单地呼叫另一个?

解决方法

区别在于您只能在2个列表上使用::: – 此操作仅在List数据类型上可用.由于列表是序列,因此它充当列表的串联运算符.

该方法更通用 – 它允许创建任何两个集合的并集.这可能是两组,在这种情况下,它充当联合,或两个序列,它充当连接.

和:::之间没有语义差异2个列表 – :::是功能列表的变体,对功能程序员来说应该更熟悉.

您在实现中看到的if语句是一个优化 – 如果此集合和该集合都是列表,只需使用list concatenation operator :::将两个列表一起添加.否则,使用通用实现将该集合和该集合的所有元素添加到类型That的适当构建器中.

因此,列表的相关差异是性能 – 对于功能列表,您不需要像通用实现那样遍历第二个列表 – 只需要重新实例化第一个列表的节点以创建新的功能列表.

(编辑:李大同)

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

    推荐文章
      热点阅读