如何在Groovy中"切片"一个集合

Bob*_*bby 12 groovy

我有一组对象,我想分成一组集合,其中每个连续的3个元素组在一个集合中.例如,如果我有

def l = [1,4,2,4,5,9]
Run Code Online (Sandbox Code Playgroud)

我想把它变成:

def r = [[1,4,2], [4,5,9]]
Run Code Online (Sandbox Code Playgroud)

我现在通过遍历集合并将其分解来实现它.但是我需要将这些"组"传递给处理它们的并行化函数.消除这种O(n)预处理会很好工作,只是说些什么

l.slice(3).collectParallel { subC -> process(subC) }
Run Code Online (Sandbox Code Playgroud)

我在Range类上找到了step方法,但看起来它只对索引起作用.任何聪明的想法?

更新:我不认为这是引用链接的重复,虽然它非常接近.如下所示,它更像是我正在寻找的迭代器类型的东西..子集合将被传递到GPars collectParallel.理想情况下,我不需要分配整个新集合.

ben*_*fer 22

查看groovy 1.8.6.List上有一个新的collat​​e方法.

def list = [1, 2, 3, 4]
assert list.collate(4) == [[1, 2, 3, 4]] // gets you everything   
assert list.collate(2) == [[1, 2], [3, 4]] //splits evenly
assert list.collate(3) == [[1, 2, 3], [4]] // won't split evenly, remainder in last list.
Run Code Online (Sandbox Code Playgroud)

查看Groovy List文档以获取更多信息,因为还有其他几个参数可以为您提供其他选项,包括删除其余部分.

就您的并行处理而言,您可以使用gpars浏览列表.

def list = [1, 2, 3, 4, 5]
GParsPool.withPool {
  list.collate(2).eachParallel {
     println it
  }
}
Run Code Online (Sandbox Code Playgroud)