channel.of( ['chr1', ['/path/to/region1_chr1.vcf', '/path/to/region2_chr1.vcf']], ['chr2', ['/path/to/region1_chr2.vcf', '/path/to/region2_chr2.vcf', '/path/to/region3_chr2.vcf']], ) .flatMap { chr, vcfs -> vcfs.collect { vcf -> tuple(groupKey(chr, vcfs.size()), vcf) // preserve group size with key } } .view { v -> "scattered: ${v}" } .groupTuple() .map { key, vcfs -> tuple(key.getGroupTarget(), vcfs) } // unwrap group key .view { v -> "gathered: ${v}" }