繁体   English   中英

在Scala中哪一个更惯用/首选:地图( <stuff> : _*) 要么 <stuff> .toMap?

[英]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

  • 另一方面, toSeqtoArray ,...在集合中定义,这意味着它们具有关于其内部的所有额外信息。

通常,您可以依靠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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM