
100
|
第
5
章
5.7
处理集合中的窗口
问题
给定值的集合,如何使用一个遍历该集合的小窗口来处理它们。
解决方案
如果要将集合切分为相同的部分,则使用 chunked 函数;如果希望将块沿集合滑动给
定间隔的块,则使用 windowed 函数。
讨论
给定一个可迭代的集合,chunked 函数将其切分为一个包含 list 的 list,每个列表都具
有给定大小或更小。chunked 函数可以返回包含列表的列表,或者你还可以提供转换
以应用于结果列表。chunked 函数的签名如下所示:
fun <T> Iterable<T>.chunked(size: Int): List<List<T>>
fun <T, R> Iterable<T>.chunked(
size: Int,
transform: (List<T>) -> R
): List<R>
这听起来比实际要复杂得多。例如,考虑一个从 0 到 10 的简单的整数区间。示例 5-19
中的测试将其分成三个连续数字的分组,或计算它们的总和或平均值。
示例 5-19:将 list 分为几个部分并进行处理
@Test
internal fun chunked() {
val range = 0..10
val chunked = range.chunked(3)
assertThat(chunked, contains(listOf(0, 1, 2), listOf(3, 4, 5),
listOf(6, 7, 8), listOf(9, 10)))