我知道如果我运行一个简单的find()
函数,例如(1 to 5).find(_ < 6)
,我将永远回复Some(1)
。
此处,find()
是确定性的,并且将始终返回相同的结果,即使集合(1 to 5)
包含使谓词_ < 6
为真的其他四个元素。
我的问题是 - find()
能否做出不确定的行为?
是否存在使collection.find(predicate)
为连续执行返回不同结果的集合和/或谓词?
答案 0 :(得分:3)
对于线性序列,find
将始终线性地进行,因此它将始终返回相同的元素。
对于非线性集合,例如Set
。
Set(1 to 5: _*).find(_ < 6) // Some(5)
Set(1 to 5: _*).find(_ < 6) // Some(5)
这里有一个不同的元素,尽管由于价值相等,实现似乎是确定性的。
这种平等很容易被打破:
// reference equality
class Box(val peer: Int) { override def toString = peer.toString }
def mkIndet() = Set((1 to 5).map(new Box(_)): _*)
mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"
另一个案例是并行集合:
def par() = (1 to 10000).par.find(i => i % 1000 == 0)
par() // "random"
par() // "random"
par() // "random"