转换
通过转换旧集合获取新集合
对目标集合的每一个元素进行转换从而创建一个新集合。
常用函数
- map():将给定的 lambda 函数应用于目标列表每个元素,并返回结果列表。 返回列表顺序与目标列表顺序相同。
- mapNotNull():可以过滤转换后为 null 的元素
- mapIndexed():与 map() 类似,但给定 lambda 函数除了可以获取元素还可以获取对应元素索引。
- mapIndexedNotNull():与 mapNotNull() 但是可以可以获取对应元素索引。
map集合的映射
map 可以转换键并保持值不变(mapKeys)或者转换值保持键不变(mapValues)。并且给定 lambda 函数可以获取 map 对应 item 。
使用两个集合构建配对列表
将两个集合中具有相同位置的元素构建配对。
常用函数
- zip(),返回Pair对象列表 ,有三种使用方法: ```kotlin val colors = listOf(“red”, “brown”, “grey”) val animals = listOf(“fox”, “bear”, “wolf”) println(colors zip animals)
val twoAnimals = listOf(“fox”, “bear”) println(colors.zip(twoAnimals))
println(colors.zip(animals) { color, animal -> “The ${animal.capitalize()} is $color”})
输出:```kotlin[(red, fox), (brown, bear), (grey, wolf)][(red, fox), (brown, bear)][The Fox is red, The Bear is brown, The Wolf is grey]
使用两个集合构建map
根据集合元素和与集合元素相关的值构建 Map 。
常用函数
- associateWith():使用目标集合的元素作为 map 的键,使用给定 lambda 函数生成对应map 的值。
- associateBy(): 使用目标集合的元素作为 map 的值,使用给定 lambda 函数生成对应map 的键。
associate(): 使用集合元素生成 map 的 键和值,要求返回一个 Pair对象。
将嵌套集合转换为扁平集合
将嵌套的集合压扁成一个集合。
常用函数flatten():通过集合的集合元素创建 list。

- flatMap(): 通过集合中元素的集合创建 list 。表现为 map() 与 flattn() 的连续调用。
过滤
获取符合条件集合
可以从已有集合中筛选出符合条件的元素生成新集合。
常用函数
- filter():返回与其条件匹配的集合元素。 List 和 Set 过滤结果都是一个 List,Map则仍然是 Map。
- filterIndexed():与 filter() 类似。但 lamb 表达式包含元素的索引和值的参数。
- filterNot():返回与其条件不匹配的集合元素。
-
获取符合和不符合条件集合
可以从已有集合中筛选出符合条件的元素组成的集合和不符合条件的元素组成的集合。
常用函数 partition():从已有集合中筛选出符合条件的元素组成的集合和不符合条件的元素组成的集合。
判断集合是否符合指定条件
检测集合是否符合给定条件。
常用函数如果至少有一个元素匹配给定谓词,那么 any() 返回 true。
- 如果没有元素与给定谓词匹配,那么 none() 返回 true。
- 如果所有元素都匹配给定谓词,那么 all() 返回 true。注意,在一个空集合上使用任何有效的谓词去调用 all() 都会返回 true 。这种行为在逻辑上被称为 vacuous truth。
加减操作
在 Kotlin 中,为集合定义了 plus (+) 和 minus (-) 操作符。 它们把一个集合作为第一个操作数;第二个操作数可以是一个元素或者是另一个集合。 返回值是一个新的只读集合:
- plus 的结果包含原始集合 和 第二个操作数中的元素。
- minus 的结果包含原始集合中的元素,但第二个操作数中的元素 除外。
如果第二个操作数是一个元素,那么 minus 移除其在原始集合中的 第一次 出现;如果是一个集合,那么移除其元素在原始集合中的 所有 出现。
有关 map 的 plus 和 minus 操作符的详细信息,请参见 Map 相关操作。对于只读集合,它们实际上使用 plus 或者 minus 操作符并尝试将结果赋值给同一变量。 因此,它们仅在由 var 声明的只读集合中可用。 对于可变集合,如果它是一个 val,那么它们会修改集合。
分组
通过分组条件对集合分组构建map
用于对集合元素进行分组。
常用函数
groupingBy() 使用一个 lambda 函数并返回一个 Map。 在此 Map 中,每个键都是 lambda 结果,而对应的值是 lambda 结果相同的元素组成的 List。 groupingBy() 提供 valueTransform 参数可以对 map 值进行转换。
还可以对分组后得到的 map 进行操作:
- eachCount() 计算每个组中的元素。
- fold() 与 reduce() 对每个组分别执行 fold 与 reduce 操作,作为一个单独的集合并返回结果。
- aggregate() 随后将给定操作应用于每个组中的所有元素并返回结果。 这是对 Grouping 执行任何操作的通用方法。当 fold() 与 reduce() 无法满足需求时,可使用它来实现自定义操作。
取部分元素
根据特定索引获取
slice() 函数接受区间或者整型值集合作为参数,函数将这些参数当做索引,来获取调用者集合中对应索引的元素,组成新列表。
从头或从尾获取元素
- take() :从头开始获取指定数量的元素。
- takeLast():从尾开始获取指定数量的元素。
函数调用的数字大于集合的大小时, 以上两个函数都会返回整个集合。
- takeWhile() 是带有谓词的 take():它将不停获取元素直到排除与谓词匹配的首个元素。如果首个集合元素与谓词匹配,则结果为空。
- takeLastWhile() 与 takeLast() 类似:它从集合末尾获取与谓词匹配的元素区间。区间的首个元素是与谓词不匹配的最后一个元素右边的元素。如果最后一个集合元素与谓词匹配,则结果为空。
从头或从尾去除元素
- drop() :从头开始去除指定数量的元素。
- dropLast():从尾开始去除指定数量的元素。
- dropWhile() 与具有相同谓词的 takeWhile() 相反:它将首个到末尾与谓词不匹配的元素返回。
- dropLastWhile() 与具有相同谓词的 takeLastWhile() 相反:它返回从开头到最后一个与谓词不匹配的元素。
让集合按指定大小分块
- chunked() 接受一个用于指定分块集合 size 的参数,并返回一个 List , List 中包含给定大小的 List 元素, 最后一个块的大小可能较小。


可以看到,集合调用 chunked() 后得到的 List 的大小并非是固定的。
调用 chunked() 时还可以使用 lambda 函数对块进行转换,如下所示:
取单个元素
按位置取
- 索引访问操作符 (get() 或 [])
返回给定位置元素,适用于 list 集合。
返回给定位置元素,适用于不提供索引访问或非静态已知提供索引访问的集合很有用。
elementAt() 的安全变体:
当指定位置超出集合范围时,函数返回 null。
接受一个 lambda 表达式(参数为访问位置),在越界时会返回 lambda 表达式结果。
检索集合的第一个元素。
检索集合的最后一个元素。
在kotlin中 Set 集合按某些顺序存储元素。在 LinkedHashSet 中元素按插入顺序排列,在 SortedSet 中,元素按自然排序顺序, 在这种情况下,元素仍会以某种顺序排序,因此,依赖元素位置的函数仍会返回其结果。 但是,除非调用者知道所使用的 Set 的具体实现,否则这些结果对于调用者是不可预测的。
按条件取
在集合中搜索与给定谓词匹配的倒数第一个元素。
如果没有元素与谓词匹配,两个函数都会抛异常。可以使用以下安全变体:
与 first() 和 last() 类似,但是找不到匹配元素时它们会返回 null,而不是抛出异常。
与 firstOrNull() 作用一致。
与 lastOrNull() 作用一致。
随机取
随机检索集合的一个元素。如果集合为空,函数会抛出异常。
随机检索集合的一个元素。如果集合为空,函数返回 null 。
排序
以下函数适用于只读函数的排序函数,这些函数会将结果作为新集合返回。
自然排序
按照其自然顺序升序排序,适用于 Comparable 元素的集合。
按照其自然顺序降序排序,适用于 Comparable 元素的集合。
自定义排序
以上函数接受一个将集合元素映射为 Comparable 值的选择器函数,并以该值的自然顺序对集合排序。
可以提供自己的 Comparator 为集合排序定义自定义顺序。
随机排序
返回一个将调用集合的集合元素随机排序的新 List。 可以不带参数或者使用 Random 对象来调用。
倒序
返回一个将调用集合的集合元素以相反的顺序排列的集合。该函数返回的时带有元素副本的新集合。 因此,如果之后改变了原始集合,先前获得的 reversed() 的结果并不会影响。
与 reversed() 类似。适用于元素不会变化的列表,对比 reversed()来说它更轻量,但原始列表的更改会影响 asReversed() 函数返回的结果集合。
