鉴于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
答案 0 :(得分:2)
没有SetView
因为视图在实施和测试方面是一件痛苦的事情,并且这种努力不值得,因为集合的优良属性通常要求您已经热切地创建了整个集合(例如O(1)
或O(log n)
查询)。
contains
不在Iterable
中,因为Set
延伸Iterable
而Set
contains
不应该输入检查,除非您问一些可能在集合中的东西。由于Iterable
是协变的,因此contains
必须承认您要求任何内容(正如contains
的{{1}}所做的那样。)
作为一种变通方法,您可以注意到Seq
与contains(x)
的内容相同,而exists(_ == x)
位于exists
上。