2

我来自 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据我所知,当一个对象从未被具有该功能的东西显式包装时,通过什么方式可以调用它?

4

1 回答 1

2

我将首先声明我绝不是 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.
}

每个并行()

GParsPool 类为集合和对象启用基于 ParallelArray(来自 JSR-166y)的并发 DSL。来源

如果我理解正确,使用 时会自动添加功能GParsPool.withPool(),它允许您使用everyParallel(). 动态编程 FTW!我猜它使用 GroovymetaClass功能​​在运行时动态添加方法,这样您就可以调用它们而无需自己添加它们。

于 2016-01-11T19:28:52.807 回答