GPars语法不熟悉

时间:2016-01-11 18:44:33

标签: groovy gpars

我来自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,因为据我所知,它从未被具有该功能的东西明确包装?

1 个答案:

答案 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功能在运行时动态添加方法,这样你就可以调用它们而无需自己添加它们。