find() 会不确定地行动吗?

Will find() ever act nondeterministically?

我知道如果我 运行 一个简单的 find() 函数,例如 (1 to 5).find(_ < 6),我将永远返回 Some(1)

这里,find() 是确定性的,并且总是 return 相同的结果,即使集合 (1 to 5) 包含使谓词 _ < 6 为真的四个其他元素。

我的问题是 - find() 可以非确定性地行动吗?

是否存在一个集合and/or 一个谓词,它会使 collection.find(predicate) return 连续执行的结果不同?

对于线性序列,find 将始终线性进行,因此它总是 return 相同的元素。

对于非线性集合,例如 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"