我来自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
,因为据我所知,它从未被具有该功能的东西明确包装?
答案 0 :(得分:2)
我将从免责声明开始,我绝不是GPars专家,但我已经在几种情况下使用过它,所以希望这里有一些有用的东西(欢迎来自社区的更新)。
<强> Closures 强>
Groovy Closures是可以传递的代码块。当参数传递到块中时,它将在->
表示法之前进入。例如:
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()强>
GParsPool类启用基于ParallelArray的(来自JSR-166y) 并发DSL用于集合和对象。 Source
如果我理解正确,使用GParsPool.withPool()
时会自动添加功能,这允许您使用everyParallel()
等方法。动态编程FTW!我猜它使用Groovy metaClass
功能在运行时动态添加方法,这样你就可以调用它们而无需自己添加它们。