2016-01-11 53 views
2

我來自Java背景,並且我在同一時間學習Groovy和Gradle,因爲我的目標是另一個。 : - /我也需要GPars的東西,因爲速度和並行性是一個問題。無論如何,我看到這個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時,它從來沒有被具有該函數的東西顯式包裝,據我所知?

回答

2

我將從免責聲明開始,我絕不是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()

的GParsPool類使基於的ParallelArray(由JSR-166y) 併發DSL的集合和對象。 Source

如果我理解正確的這個,有功能使用GParsPool.withPool()時自動添加,它允許您使用方法,如everyParallel()。動態編程FTW!我猜測它使用Groovy metaClass功能在運行時動態添加方法,以便您可以在不添加它們的情況下調用它們。