20

在集合的映射中查找结果的习惯用法是这样的:

list.view.map(f).find(p)

其中list是 a List[A]f是 a A => B,并且p是 a B => Boolean

是否可以view与并行集合一起使用?我问是因为我得到了一些非常奇怪的结果:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None
4

1 回答 1

1

请参阅Martin Odersky 等人的论文“A Generic Parallel Collection Framework”,该论文讨论了新的并行集合。第 8 页有一节“并行视图”讨论了如何view以及par可以一起使用,以及这如何为视图和并行计算带来性能优势。

至于您的具体示例,这绝对是一个错误。该exists方法也会中断,并且让它在一个列表上中断会破坏所有其他列表,所以我认为这是一个问题,其中可能会在中途中止的操作(find并且exists一旦有答案就可以停止)设法中断线程以某种方式游泳池。它可能与传递给并行集合的函数内部抛出异常有关。如果是这样,它应该在 2.10 中修复。

于 2012-02-27T00:15:08.053 回答