GPars 语法不熟悉

GPars syntax unfamiliar

我来自 Java 背景,我一直在同时学习 Groovy 和 Gradle,因为我的目标是另一个。 :-/ 我也需要 GPars 的东西,因为速度和并行性是一个问题。无论如何,我看到这个 GPars 示例,我有一些我认为是语言细微差别的问题,而不是图书馆问题,我还不明白。

//check whether all elements within a collection meet certain criteria
 GParsPool.withPool(5) { ForkJoinPool pool ->
     assert [1, 2, 3, 4, 5].everyParallel {it > 0}
     assert ![1, 2, 3, 4, 5].everyParallel {it > 1}
 }

我明白了ForkJoinPool pool ->..。为什么两条线不是这样用大括号包裹起来的。如果它只是一个可选的遗漏,就像分号一样,你似乎会失去对范围的跟踪:

//check whether all elements within a collection meet certain criteria
 GParsPool.withPool(5) { ForkJoinPool pool -> {
     assert [1, 2, 3, 4, 5].everyParallel {it > 0}
     assert ![1, 2, 3, 4, 5].everyParallel {it > 1}
   }
 }

什么是it?它是一个迭代器吗? it 哪里来的?

据我所知,当一个对象从未被具有该功能的东西显式包装时,通过什么方式可以调用该对象的 .everyParallel

首先声明一下,我绝不是 GPars 专家,但我已经在一些情况下使用过它,所以希望这里能提供一些有用的东西(欢迎来自社区的更新)。

Closures

Groovy 闭包是可以传递的代码块。当参数被传递到块中时,它将在 -> 符号之前出现。例如:

GParsPool.withPool(5) { ForkJoinPool pool ->
  // Here the `pool` object is available to use for processing.
}

在您未提供定义变量的情况下,包含一个隐含的 it 对象。上面的闭包可以这样写:

GParsPool.withPool(5) { Object it ->
  // Generically stating that a single object will be passed in, called "it". In this example it is a `ForkJoinPool` object.
}

GParsPool.withPool(5) {
  // No "it" object is specified, but you can still use "it" because it is implied.
}

everyParallel()

The GParsPool class enables a ParallelArray-based (from JSR-166y) concurrency DSL for collections and objects. Source

如果我没有理解错的话,在使用 GParsPool.withPool() 时会自动添加一些功能,这样您就可以使用 everyParallel() 等方法。动态规划!我猜它使用 Groovy metaClass 功能在运行时动态添加方法,这样您就可以调用它们而无需自己添加它们。