本文继续补充Kotlin集合高阶函数~
filter{...}
: 过滤函数,返回满足指定条件的元素集合
filterIndexed{...}
: 与filter{}
类似,在过滤时可以操作元素下标(index
)
filterNot{...}
: 与filter{}
相反
filterNotNull()
: 返回集合中不为null
的元素集合,也就是过滤掉集合中的null
元素
take(num)
: 返回集合中前num
个元素组成的集合(针对所有Iterable
容器)
takeWhile{...}
: 循环遍历集合,从第一个元素开始遍历,当出现一个不满足条件的元素时,退出遍历,返回遍历过程满足条件的元素(针对所有Iterable
容器)
takeLast(num)
: 返回集合中后num
个元素组成的集合(针对List
)
takeLastWhile{...}
: 与takeWhile{...}
类似,遍历是从最后一个元素开始(针对List
)
drop(num)
: 过滤集合中前num
个元素,返回剩余元素(针对所有Iterable
容器)
dropWhile{...}
: 循环遍历集合,从第一个元素开始遍历,当出现一个不满足条件的元素时,退出遍历,返回除遍历过程满足条件的元素外的剩余元素(针对所有Iterable
容器)
dropLast(num)
: 返回集合中除后num
个元素外的其他元素(针对List
)
dropLastWhile{...}
: 相同条件下,与takeLastWhile{...}
得到的结果相反(针对List
)
distinct()
: 去除重复元素
distinctBy{...}
: 根据操作元素后的结果去重,返回的集合元素顺序与原集合保持一致
slice
: 按元素下标过滤元素
示例:
`val list = listOf("a", "bc", "def", "g", "hijk", "lmn") println(list.take(2)) // [a, bc] println(list.takeWhile { it.length < 4 }) // [a, bc, def, g] println(list.takeLast(2)) // [hijk, lmn] println(list.takeLastWhile { it.length < 4 }) // [lmn] println(list.drop(2)) // [def, g, hijk, lmn] println(list.dropWhile { it.length < 4 }) // [hijk, lmn] println(list.dropLast(2)) // [a, bc, def, g] println(list.dropLastWhile { it.length < 4 }) // [a, bc, def, g, hijk] val list3 = listOf(1, 1, 2, 3, 3, 4, 5) println(list3.distinct()) // [1, 2, 3, 4, 5] println(list3.distinctBy { it % 2 }) // [1, 2] println(list3.slice(0..2)) // [1, 1, 2] println(list3.slice(listOf(2, 3, 4))) // [2, 3, 3] `
plus()
: 合并两个集合。对于可变集合,此操作会直接修改集合内容;对于不可变集合,它会返回一个新的合并后的集合。也可以使用符号+
zip
: 将两个集合的对应元素配对,形成一个新的集合,每个元素是一个Pair
。如果两个集合长度不一致,结果集的长度将与较短的那个集合相同。
unzip
:与zip
相反,将一个包含Pair
的集合转换回两个集合。每个Pair
的元素分别放入两个集合中。
partition
: 根据给定的条件将集合分为两个子集合:分别存放满足条件的元素和不满足条件的元素。
示例:
`val list1 = listOf(1, 2, 3) val list2 = listOf(4, 5) val combined = list1 + list2 // combined 是 [1, 2, 3, 4, 5] val names = listOf("Alice", "Bob") val ages = listOf(24, 30) val nameAgePairs = names.zip(ages) // nameAgePairs 是 [("Alice", 24), ("Bob", 30)] val pairs = listOf("Alice" to 24, "Bob" to 30) val (namesList, agesList) = pairs.unzip() // namesList 是 ["Alice", "Bob"], agesList 是 [24, 30] val numbers = listOf(1, 2, 3, 4, 5) val (even, odd) = numbers.partition { it % 2 == 0 } // even 是 [2, 4], odd 是 [1, 3, 5] `
any()
,any{...}
: 检查集合中是否有至少一个元素满足给定条件。无参数版any()
用于判断集合是否非空。`val numbers = listOf(1, 2, 3, 4) val hasEven = numbers.any { it % 2 == 0 } // true val isEmpty = listOf<Int>().any() // false `
all{...}
: 检查集合中的所有元素是否都满足给定条件`val numbers = listOf(2, 4, 6, 8) val allEven = numbers.all { it % 2 == 0 } // true `
none()
,none{...}
: 集合中是否所有元素都不满足给定条件。无参数版none()
判断集合是否为空`val numbers = listOf(1, 3, 5) val noEven = numbers.none { it % 2 == 0 } // true val isEmpty = listOf<Int>().none() // true `
max()
,maxBy{...}
: 返回集合中的最大值。max()
适用于Comparable
类型的集合,maxBy{...}
接受一个lambda
表达式来确定比较标准`val numbers = listOf(1, 3, 2) val maxVal = numbers.maxOrNull() // 3 val maxByAbs = numbers.maxBy { -it } // 1,这里取负数,所以实际是最小值的绝对值最大 `
min()
, minBy{...}
: 类似于max()
和maxBy{...}
, 但用于找到最小值`val numbers = listOf(1, 3, 2) val minVal = numbers.minOrNull() // 1 `
sum()
, sumBy{...}
, sumByDouble{...}
: 计算集合元素的总和。sum()
用于数值类型集合的直接求和。sumBy{...}
和sumByDouble{...}
则用于根据提供的函数计算总和`val numbers = listOf(1, 2, 3) val directSum = numbers.sum() // 6 val mappedSum = numbers.sumBy { it * 2 } // 12 `
average()
: 计算集合中数值的平均值`val numbers = listOf(1.0, 2.0, 3.0) val avg = numbers.average() // 2.0 `
reduce{...}
,reduceIndexed{...}
,reduceRight{...}
, reduceRightIndexed{...}
: 对集合元素进行累积操作,可以自定义累积逻辑。reduceRight{...}
和reduceRightIndexed{...}
是从右到左累积`val numbers = listOf(1, 2, 3) val product = numbers.reduce { acc, i -> acc * i } // 6, 累乘 val rightSum = numbers.reduceRight { acc, i -> acc + i } // 6, 从右到左累加 `
fold{...}
,foldIndexed{...}
,foldRight{...}
,foldRightIndexed{...}
: 类似于reduce
,但第一个参数可以指定初始值。foldRight
系列也是从右向左折叠。`val numbers = listOf(1, 2, 3) val foldedWithInit = numbers.fold(10) { acc, i -> acc + i } // 16, 初始值10,累加 `