我来自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功能的东西显式包装,那么如何才能调用该对象?
发布于 2016-01-11 19:28:52
我将从声明开始,我绝不是GPars专家,但是我已经在几种情况下使用过它,所以希望这里有一些有用的东西(欢迎来自社区的更新)。
闭包
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()
GParsPool类为集合和对象启用了基于并行数组(来自JSR-166y)的并发DSL。来源
如果我正确理解了这一点,那么在使用GParsPool.withPool()时会自动添加功能,这允许您使用像everyParallel()这样的方法。动态编程FTW!我猜它使用Groovy metaClass功能在运行时动态添加方法,这样您就可以调用它们而不必自己添加它们。
https://stackoverflow.com/questions/34728763
复制相似问题