:::和列表之间有什么区别?
发布时间: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的适当构建器中. 因此,列表的相关差异是性能 – 对于功能列表,您不需要像通用实现那样遍历第二个列表 – 只需要重新实例化第一个列表的节点以创建新的功能列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |