Kotlin-集合

本文详细介绍了Kotlin中集合的使用,包括set、list、map的创建、迭代器、序列化处理、过滤、集合的加减、分组、取集合的一部分、取单个元素、排序、聚合操作等。通过实例展示了各种操作方法,方便开发者快速理解和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

前言

集合是一个大头,经常会碰到。
所以,我做了一个集锦。看起来会比较长,所以,我做了一些取舍。尽量缩短,又可以了解清楚。

这部分的内容,大部分语言都会涉及。有些地方就不放开详述。

文章定位你可以大体了解有哪些。大致怎么用。

用到的时候,完全可以查一下就知道了。

目录如下

  • set、list以及map
  • 创建
  • 迭代器
  • 序列化处理
  • 过滤
  • 集合的加减
  • 分组
  • 取集合的一部分
  • 取单个元素
  • 排序
  • 聚合操作
  • 集合写操作
  • list
  • Set
  • Map

set、list 以及 map

这图太棒了。基本就把Kotlin中的集合说个框架了。
在这里插入图片描述
主要分为mutable可变、跟非可变


创建

大致格式就是这样。
listOf()、setOf()、mutableListOf()、mutableSetOf()

范例
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
val numbersSet = setOf("one", "two", "three", "four")
空集合

emptyList()、emptySet() 与 emptyMap()


迭代器

跟java基本上是差不多的。之前的Kotlin入门中,也讲到过。就不详述了。每个部分,给范例大致看一下。

iterator

看下范例,就清楚了,其他语言你很可能碰到过了
val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
    println(numbersIterator.next())
}

for…in

看下范例,就清楚了,其他语言你很可能碰到过了
val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
    println(item)
}

forEach

看下范例,就清楚了,其他语言你很可能碰到过了
val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
    println(it)
}

分为可变迭代器和非可变迭代器

怎么区分呢
可从字面上了解,如果mutableXXXXOf
那么调用iterator得到的 -> 就是可变的iterator

so Easy》。。。。。


序列化处理

可以用sequenceOf得到序列化

可以单个操作
看下范例,就清楚了,其他语言你很可能碰到过了
val numbers = listOf("one", "two", "three", "four")
val numbersSequence = numbers.asSequence()
也可以块级操作
看下范例,就清楚了,其他语言你很可能碰到过了
val oddNumbers = sequence {
    yield(1)
    yieldAll(listOf(3, 5))
    yieldAll(generateSequence(7) { it + 2 })
}
println(oddNumbers.take(5).toList())

过滤

区分

看下范例,就清楚了,其他语言你很可能碰到过了

看范例一

val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
println(filteredMap)

看范例二

val numbers = listOf("one", "two", "three", "four")
val filteredIdx = numbers.filterIndexed { index, s -> (index != 0) && (s.length < 5)  }
val filteredNot = numbers.filterNot { it.length <= 3 }

println(filteredIdx)
println(filteredNot)

这里用的是filter函数

划分

看下范例,就清楚了
val numbers = listOf("one", "two", "three", "four")
val (match, rest) = numbers.partition { it.length > 3 }

println(match)
println(rest)

这里用的是partition

检验谓词

  • any()
    有一个为true即返回true
  • none()
    一个都不匹配返回true
  • all()
    所有都匹配返回true

集合的加减

看下范例,就清楚了
val numbers = listOf("one", "two", "three", "four")

val plusList = numbers + "five"
val minusList = numbers - listOf("three", "four")
println(plusList)
println(minusList)

输出结果

one, two, three, four, five]
[one, two]

集合可以这么进行加减,按照推导的原理,的确可以这么做。符合逻辑。于是kotlin便支持了。只是这里的 集合添加删除 单个\多个collection进一步被简化。


分组

groupBy

val numbers = listOf("one", "two", "three", "four", "five")

println(numbers.groupBy { it.first().toUpperCase() })
println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.toUpperCase() }))

输出结果

{O=[one], T=[two, three], F=[four, five]}
{o=[ONE], t=[TWO, THREE], f=[FOUR, FIVE]}

操作类型

  • eachCount()
    统计计数
  • fold() and reduce()
    将每个分组当成独立的分组进行计算
  • aggregate()
    通过一个函数(operation)混合每种分类中每个元素的结果
    这是通用方法
    可以提供自定义操作

取集合的一部分

slice()

从某个位置开始得到新集合,js也有这个操作。

take(3)、takeLast(3)、drop(3)、Last(3)、takeWhile(3)、takeLastWhile(3)、dropWhile()、dropLastWhile

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.takeWhile { !it.startsWith('f') })
    println(numbers.takeLastWhile { it != "three" })
    println(numbers.dropWhile { it.length == 3 })
    println(numbers.dropLastWhile { it.contains('i') })
}

输出结果

[one, two, three]
[four, five, six]
[three, four, five, six]
[one, two, three, four]

chunked

截取头几个element

windowed

得到多个数组。每几个element组成一个collection

val numbers = listOf("one", "two", "three", "four", "five")    
println(numbers.windowed(3))

输出结果

[[one, two, three], [two, three, four], [three, four, five]]

支持

  • step 步长
  • partialWindows
范例二
val numbers = (1..10).toList()
println(numbers.windowed(3, step = 2, partialWindows = true))
println(numbers.windowed(3) { it.sum() })

输出结果

[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10]]
[6, 9, 12, 15, 18, 21, 24, 27]

zipWithNext

跟隔壁的element打包

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")    
    println(numbers.zipWithNext())
    println(numbers.zipWithNext() { s1, s2 -> s1.length > s2.length})
}

输出结果

[(one, two), (two, three), (three, four), (four, five)]
[false, false, true, false]

取单个元素

按位置取

elementAt

取第一个或最后一个

first()
last()

取不到怎么处理

elementAtOrNull()
elementAtOrElse()

fun main() {
    val numbers = listOf("one", "two", "three", "four", "five")
    println(numbers.elementAtOrNull(5))
    println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
}

输出结果

null
The value for index 5 is undefined

按条件取

范例
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.first { it.length > 3 })
println(numbers.last { it.startsWith("f") })

输出结果

three
fiv

find()

fun main() {
    val numbers = listOf(1, 2, 3, 4)
    println(numbers.find { it % 2 == 0 })
    println(numbers.findLast { it % 2 == 0 })
}

输出结果

2
4

随机取元素

val numbers = listOf(1, 2, 3, 4)
println(numbers.random())

判断是否存在

contains


排序

这一块基本就是copy JavaScript的

  • sorted()
  • sortedDescending()
  • 自定义
    - sortedBy { it.length }
  • 倒序
    - reversed()
  • 随机
    - shuffled()

聚合操作

就是对整体collection进行操作

  • min() and max()
    返回最大或最小值
  • average()
    返回所有值的平均值
  • sum()
    返回所有值的和
  • count()
    进行统计计数
  • fold()\reduce()
    会使用初始值进行操作
看范例,再理解一下
fun main() {
    val numbers = listOf(5, 2, 10, 4)

    val sum = numbers.reduce { sum, element -> sum + element }
    println(sum)  // 21
    val sumDoubled = numbers.fold(2) { sum, element -> sum + element * 3 }
    println(sumDoubled)  // 65
}

集合写操作

add()
remove()


list

取单个值

get(0)
getOrNull(5)
getOrElse(5, {it})

取列表的一部分

subList(3, 6)

查找元素位置

indexOf(2)
lastIndexOf(2)
indexOfFirst { it > 2}
indexOfLast { it % 2 == 1}

有序列表中二分查找

binarySearch

Comparator 二分搜索

val productList = listOf(
    Product("WebStorm", 49.0),
    Product("AppCode", 99.0),
    Product("DotTrace", 129.0),
    Product("ReSharper", 149.0))

println(productList.binarySearch(Product("AppCode", 99.0), compareBy<Product> { it.price }.thenBy { it.name }))

输出结果

1

比较函数二分搜索

binarySearch { priceComparison(it, 99.0) }

List 写操作

  • add
  • remove
  • fill
  • sort()
  • sortDescending
  • sortBy
  • shuffle
  • reverse
  • asReversed

Set

  • union()
    将两个collections合并
  • intersect()
    在当前数组中找 目标元素,找到后返回该元素
  • subtract()
    在当前数组中,找 不是目标元素 的元素,找到后返回

Map

  • 取值
    get()
    getValue
    getOrElse
    getOrDefault
  • 过滤
    filter
    这里就不在详述了
  • plus和minus操作
    根据 key值,进行Map数组的元素的加减
fun main() {
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap + Pair("four", 4))
    println(numbersMap + Pair("one", 10))
    println(numbersMap + mapOf("five" to 5, "one" to 11))
}

输出结果

{one=1, two=2, three=3, four=4}
{one=10, two=2, three=3}
{one=11, two=2, three=3, five=5}
  • 写操作
    • putAll
    • put
    • remove

小结

Kotlin在集合这部分,借鉴了JS在这方面的便捷性,增强了基本的API。

<think>嗯,用户的问题是关于Kotlin 1.3.40中kotlin-stdlib-jdk7和kotlin-stdlib的区别以及它们的用法差异。我需要先回顾之前的对话,确保回答的一致性。用户之前遇到了ARouter的问题,现在转向了Kotlin标准库的不同版本的问题。 首先,用户引用了四个参考资料,其中提到了一些版本变更,比如将jre7改为jdk7,还有协程库的版本问题。这可能意味着用户在使用旧版本时遇到了兼容性问题,或者需要明确不同库之间的区别。 我需要先解释这两个库的基本区别。kotlin-stdlib是Kotlin的核心标准库,而kotlin-stdlib-jdk7是扩展库,针对JDK7以上的API进行扩展。在Kotlin 1.3.40的版本中,这些库的使用有什么不同呢? 根据用户提供的引用[1],原来的jre7被替换为jdk7,这可能是因为JDK的命名从JRE改为JDK,所以库的命名也随之改变。因此,在Kotlin 1.3.x版本中,应该使用jdk7而不是jre7。需要指出这一点,避免用户混淆。 然后,用户提到不同版本下的用法差异。比如在Kotlin 1.1到1.2版本中,可能需要显式添加jdk7或jdk8的库,而1.3之后可能自动包含。但需要确认具体版本的变化,确保回答准确。 另外,用户之前的回答中提到了ARouter的问题,可能与Kotlin版本和注解处理器有关。所以,在回答时可能需要提到版本兼容性对库选择的影响,特别是在多模块或混合Java/Kotlin项目中的注意事项。 用户可能需要了解如何正确配置依赖,尤其是在Gradle中如何声明这些库,以及不同版本之间的兼容性。例如,引用[2]提到Kotlin协程需要1.3.+版本,并且Gradle插件版本要3.0.0以上。这可能与标准库的版本选择有关联,需要指出。 还要注意用户的问题中提到的是Kotlin 1.3.40,这个版本是否有什么特殊之处?比如是否在1.3.40中,stdlib的结构有变化,或者是否推荐使用某个特定的库版本。 另外,用户引用的资料中有关于Gradle插件版本的配置,比如使用3.6.0-alpha12,这可能影响构建过程,但用户现在的问题是关于标准库的差异,可能需要简要提及构建配置中的相关部分,但重点还是库的区别。 总结一下,回答的结构应该是先介绍两个库的基本区别,然后说明在Kotlin 1.3.40中的具体用法,包括依赖配置、版本兼容性,以及可能遇到的常见问题,比如重复依赖或版本冲突。同时,结合用户之前的ARouter问题,指出正确选择库的重要性,以避免类似的问题再次发生。 需要确保回答准确,并且参考用户提供的引用资料,特别是关于版本替换的部分,比如jre7改为jdk7,以及协程库的版本要求。同时,用户可能希望知道在混合项目中的最佳实践,比如是否需要同时引入两个库,或者如何避免依赖冲突。 最后,生成的相关问题需要与当前主题相关,比如版本升级的影响、依赖冲突解决、多JDK版本的支持等,帮助用户进一步了解可能遇到的问题。</think>### Kotlin 1.3.40 中 `kotlin-stdlib-jdk7` 与 `kotlin-stdlib` 的区别及用法解析 --- #### 一、核心区别 1. **`kotlin-stdlib`** - **基础标准库**:包含Kotlin语言的核心API,例如集合操作、协程基础、字符串处理等。 - **最低兼容性**:支持所有JDK版本(包括JDK 6+)。 - **依赖声明**: ```gradle implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" ``` 2. **`kotlin-stdlib-jdk7`** - **扩展标准库**:在`kotlin-stdlib`基础上,扩展了针对**JDK 7+**的API支持,例如: - `AutoCloseable`扩展(如`use`函数) - `Path`和`Files`的Kotlin DSL - JDK 7的时间日期API适配(如`java.nio.file`相关操作- **依赖声明**: ```gradle implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" ``` --- #### 二、在 Kotlin 1.3.40 中的使用差异 | 场景 | `kotlin-stdlib` | `kotlin-stdlib-jdk7` | |--------------------------|-------------------------------------|-------------------------------------| | **JDK版本要求** | JDK 6+ | JDK 7+ | | **功能覆盖** | 基础Kotlin功能 | 基础功能 + JDK 7扩展API | | **混合项目兼容性** | 通用 | 需确保项目JDK版本 ≥7 | | **依赖冲突处理** | 自动包含在Kotlin插件中[^1] | 需显式声明,与`kotlin-stdlib`共存 | --- #### 三、版本适配规则 1. **Kotlin 1.1-1.2 版本** - `kotlin-stdlib`默认包含**JDK 6**兼容实现。 - 如需使用JDK 7/8扩展API,必须显式添加`kotlin-stdlib-jdk7`或`kotlin-stdlib-jdk8`。 2. **Kotlin 1.3+ 版本(含1.3.40)** - **自动依赖传递**: `kotlin-stdlib-jdk7`会**自动包含`kotlin-stdlib`**,无需重复声明[^1]。 - **版本对齐要求**: 所有Kotlin库版本需严格一致(如协程库`kotlinx-coroutines-core`也需使用1.3.x版本)[^2]。 --- #### 四、典型配置示例(Kotlin 1.3.40) ```gradle // build.gradle (Module) dependencies { // 基础库(自动包含kotlin-stdlib) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.40" // 协程库(需版本对齐) implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2" } ``` --- #### 五、常见问题解决 1. **`jre7`与`jdk7`命名差异** - **历史遗留问题**:早期版本使用`kotlin-stdlib-jre7`,自Kotlin 1.2起统一改为`kotlin-stdlib-jdk7`[^1]。 - **错误示例**: ```gradle // 已废弃的写法(会导致依赖缺失) implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.40" ``` 2. **版本冲突警告** 若出现类似`Conflict with dependency 'org.jetbrains.kotlin:kotlin-stdlib'`错误,添加强制版本约束: ```gradle configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib:1.3.40" } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值