启用并行集合处理和使用 map/reduce 的函数式风格
并行集合处理
以下方法目前在 Groovy 中的所有对象上都受支持
- eachParallel()
- eachWithIndexParallel()
- collectParallel()
- findAllParallel()
- findParallel()
- everyParallel()
- anyParallel()
- grepParallel()
- groupByParallel()
- foldParallel()
- minParallel()
- maxParallel()
- sumParallel()
//summarize numbers concurrently
ForkJoinPool.withPool {
final AtomicInteger result = new AtomicInteger(0)
[1, 2, 3, 4, 5].eachParallel {result.addAndGet(it)}
assert 15 == result
} //multiply numbers asynchronously
ForkJoinPool.withPool {
final List result = [1, 2, 3, 4, 5].collectParallel {it * 2}
assert ([2, 4, 6, 8, 10].equals(result))
}
元类增强
import groovyx.gpars.ParallelEnhancerdef list = [1, 2, 3, 4, 5, 6, 7, 8, 9] ParallelEnhancer.enhanceInstance(list) println list.collectParallel {it * 2 }
透明并行集合
ForkJoinPool.withPool { //The selectImportantNames() will process the name collections concurrently
assert ['ALICE', 'JASON'] == selectImportantNames(['Joe', 'Alice', 'Dave', 'Jason'].makeConcurrent())
}
/**
* A function implemented using standard sequential collect() and findAll() methods.
*/
def selectImportantNames(names) {
names.collect {it.toUpperCase()}.findAll{it.size() > 4}
}
Map/Reduce
可用方法
- map()
- reduce()
- filter()
- size()
- sum()
- min()
- max()
collection 属性将返回包装在 Groovy 集合实例中的所有元素。
println 'Number of occurrences of the word GROOVY today: ' + urls.parallel
.map {it.toURL().text.toUpperCase()}
.filter {it.contains('GROOVY')}
.map{it.split()}
.map{it.findAll{word -> word.contains 'GROOVY'}.size()}
.sum()