【问题标题】:What's the most idiomatic way to express an iterable of a single element in Scala?在 Scala 中表达单个元素的可迭代的最惯用方式是什么?
【发布时间】:2016-05-19 02:38:23
【问题描述】:

到目前为止,当我需要传递一个仅包含一个元素的 Iterable 时,我传递了一个 Some 值;但这需要隐式转换。

在 Java 中我会使用 java.util.Collections.singleton,我猜想在 Scala 中有一些等价的东西更适合这个用例。

【问题讨论】:

  • 一个Option[T]可以在没有隐式转换的情况下被迭代(例如.toList)。使用List(single) 也没有错。
  • 我这样做了几十亿次,所以我认为使用最轻量级的实现不会有什么坏处(尽管我的感觉是 JIT 可能很容易内联)

标签: scala collections optional


【解决方案1】:

Iterable(x),就像获取你编写的单个元素的Seq Seq(x)List(x) 等一样。

【讨论】:

    【解决方案2】:

    在查看了可以满足要求的集合(IterableSeqList)的apply 方法(构造函数)的实现之后,他们采用了需要额外包装对象的可变参数在一个数组中,然后循环它或调用另一个方法。

    所以我想我会坚持consingx :: Nil这样的对象;这看起来是实现它的最轻量级的方式,而且很明显您正在制作一个集合。

    【讨论】:

    • 可变参数包装只是机械。恕我直言,您不能事后猜测语言机器。如果您无法将f(x: X) 添加到f(xs: Iterable[X]),则可能是一个隐式包装器。这避免了额外的包装器和额外的语法。也许您可以适当地确定隐式范围。
    • 可能 GenericCompanion 应该有一个应用程序,它需要一个元素,另一个需要两个或更多元素,就像其他 API 一样。
    • 所以关于 gitter 的答案是重载是邪恶的,我们已经知道了。
    猜你喜欢
    • 2011-08-03
    • 2016-07-21
    • 2015-05-11
    • 1970-01-01
    • 2012-06-18
    • 2018-12-01
    • 1970-01-01
    • 2011-03-07
    • 2010-09-30
    相关资源
    最近更新 更多