【问题标题】:Why does Scala have SeqView but not SetView?为什么 Scala 有 SeqView 而没有 SetView?
【发布时间】:2014-10-15 17:42:04
【问题描述】:

鉴于Seq.view 返回一个SeqView,我本来希望Set.view 返回一个SetView,但不存在这样的视图; Set.view 而是返回 IterableView

很遗憾,IterableView 缺少一些方法,例如 contains。比较这些,例如:

Seq(1, 2, 3).view.map(_ * 2).contains(4) // returns true
Set(1, 2, 3).view.map(_ * 2).contains(4) // error

SetView 类不存在有什么特别的原因吗?

另外,Iterable 没有 contains 方法有什么原因吗(鉴于这基本上是 find 的一种特殊情况)?

鉴于上述情况,在使用集合时是否有更好的替代方案(换句话说,Scala 的最佳实践是什么):

Set(1, 2, 3).view.map(_ * 2).find(_ == 4).isDefined

【问题讨论】:

标签: scala scala-2.10


【解决方案1】:

没有SetView,因为实现和测试视图是一件头疼的事,而且这种努力不太值得,因为集合的良好属性通常要求您已经急切地创建了整个集合(例如@987654322 @ 或 O(log n) 查找)。

contains 不在Iterable 中正是因为Set 扩展了IterableSet contains 不应该键入检查,除非您要求可能在集合中的东西。因为Iterable 是协变的,所以它的contains 必须承认你要求任何东西(就像Seqcontains 一样)。

作为一种解决方法,您可以注意到contains(x)exists(_ == x) 做同样的事情,而existsIterable 上。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2011-05-30
    • 2011-05-04
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多