[英]Which one is more idiomatic/preferred in Scala: Map(<stuff>: _*) or <stuff>.toMap?
这些看起来实际上是等价的:
scala> ("asd" zip "zxc").toMap
res62: scala.collection.immutable.Map[Char,Char] = Map(a -> z, s -> x, d -> c)
scala> Map(("asd" zip "zxc"): _*)
res63: scala.collection.immutable.Map[Char,Char] = Map(a -> z, s -> x, d -> c)
但是,真实的生活差异是什么? 哪一个比较惯用? 运行时性能会有所不同吗?
我敢肯定,同样的/类似的问题可能会被问到其他类似的结构对,所以请随意给出更一般/抽象的答案:)
还有是因为,定义这些方法的两者之间的真正区别:
apply
构造函数在目标集合的伴随中定义:
object Coll { def apply[T](els: T*): Coll[T] = ??? }
这意味着除了Seq
元素之外,它绝对没有关于输入的信息,因此它只是遍历该序列并构建Coll
。
另一方面, toSeq
, toArray
,...在源集合中定义,这意味着它们具有关于其内部的所有额外信息。
通常,您可以依靠toXXX
方法在需要时进行短路,或者返回一些有意义的专用集合。
作为一个愚蠢的例子,考虑:
List(1,2,3).toSeq // toSeq returns `this`, there is no overhead
// vs.
Seq(List(1,2,3): _*) // this will copy that list into a new one...
这会变得更糟,你用Stream.continually(1)
替换该列表...
我个人更喜欢第一个变体,因为它更清晰可读。 两者在性能或其他特征上没有实际差异。 在第一种情况下,你创建一个索引seq,然后在第二种情况下将它转换为map,你使用这个seq提取器sintax :_*
这是Scala最好的部分。 就像Odersky教授告诉许多人一样,Scala设计的一部分是为不同的问题提供制作设计解决方案。 所以在这种情况下,你可以选择任何。 但正如我告诉你的第一个更清晰易懂,将硬核符号编程Scalaz
=)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.