为什么Scala有SeqView而不是SetView?

时间:2014-10-15 17:42:05

标签: scala scala-2.10

鉴于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方法的原因(鉴于这基本上是查找的一个特例)?

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

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

1 个答案:

答案 0 :(得分:2)

没有SetView因为视图在实施和测试方面是一件痛苦的事情,并且这种努力不值得,因为集合的优良属性通常要求您已经热切地创建了整个集合(例如O(1)O(log n)查询)。

contains不在Iterable中,因为Set延伸IterableSet contains不应该输入检查,除非您问一些可能在集合中的东西。由于Iterable是协变的,因此contains必须承认您要求任何内容(正如contains的{​​{1}}所做的那样。)

作为一种变通方法,您可以注意到Seqcontains(x)的内容相同,而exists(_ == x)位于exists上。