Scala 有明确的大小和知识
我正在浏览Scala中的Scala 有明确的大小和知识,scala,scala-collections,Scala,Scala Collections,我正在浏览Scala中的列表方法 val mylist = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 10) 我被hasDefiniteSize和knownSize弄糊涂了 对于List,hasDefiniteSize返回true,knownSize返回-1 这些方法背后的确切理论是什么?此方法由列表的超类定义,该超类与可能无限的集合(如流s、懒散列表s和迭代器s)相同 关于更多细节,我相信文档中的描述是最好的 这是一个用于: 测试是否已知此集合的大小有限。
列表
方法
val mylist = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 10)
我被hasDefiniteSize
和knownSize
弄糊涂了
对于List
,hasDefiniteSize
返回true
,knownSize
返回-1
这些方法背后的确切理论是什么?此方法由
列表
的超类定义,该超类与可能无限的集合(如流
s、懒散列表
s和迭代器
s)相同
关于更多细节,我相信文档中的描述是最好的
这是一个用于:
测试是否已知此集合的大小有限。全部的
严格集合的大小是有限的。对于非严格的
集合(如Stream),如果所有元素
已经计算过了。如果流还没有打开,则返回false
评估到底。非空迭代器通常返回false,即使
它们是从已知有限大小的集合中创建的
注意:许多收集方法在无限长的集合上不起作用
尺寸。典型的故障模式是无限循环。这些方法
始终在不首先检查hasDefiniteSize的情况下尝试遍历
返回true。但是,检查hasDefiniteSize可以提供
保证尺寸定义明确,不终止不是一个问题
担心
请注意,hasDefiniteSize
已被弃用,并显示以下消息:
(自2.13.0版起)检查.knownSize而不是.hasDefiniteSize
有关更多可操作的信息(有关详细信息,请参阅scaladoc)
进一步声明:
此集合中的元素数(如果可以便宜地使用)
计算得出,否则为-1。便宜通常意味着:不需要
集合遍历
List
是链表的实现,这就是为什么List(1,2,3)返回true
(集合不是无限的),而是List(1,2,3)。knownSize
返回-1
(计算集合大小需要遍历整个列表).有些收藏知道它们的大小
Vector(1,2,3).knownSize // 3
有些则不然
List(1,2,3).knownSize // -1
如果一个集合知道它的大小,那么可以优化一些操作,例如,考虑如何使用<代码> NoNeSige以尽早返回
def sizeCompare(that: Iterable[_]): Int = {
val thatKnownSize = that.knownSize
if (thatKnownSize >= 0) this sizeCompare thatKnownSize
else {
val thisKnownSize = this.knownSize
if (thisKnownSize >= 0) {
val res = that sizeCompare thisKnownSize
// can't just invert the result, because `-Int.MinValue == Int.MinValue`
if (res == Int.MinValue) 1 else -res
} else {
val thisIt = this.iterator
val thatIt = that.iterator
while (thisIt.hasNext && thatIt.hasNext) {
thisIt.next()
thatIt.next()
}
java.lang.Boolean.compare(thisIt.hasNext, thatIt.hasNext)
}
}
}
请参见相关问题,了解什么样的列表?你能提供一个例子吗?val mylist=List(1,2,3,4,5,6,7,8,9,10,3,10)