一个例子看懂kotlin的集合和序列

这篇博客对比了集合与序列在构造和处理元素时的差异。通过示例展示了如何使用setOf、mutableSetOf、mapOf以及sequenceOf等构造方法创建只读和可变集合,以及如何通过filter、map和take等函数处理元素。在集合中,这些操作会立即执行;而在序列中,操作仅在需要结果时才会执行,提供延迟计算的效率优势。

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

构造对比:

1.集合

这里setOf和mutableSetOf就是一个只读,一个支持修改处理。因为集合泛型的擦除,val和var其实不能控制只读和读写。故用这种构造方法。

// 挨个元素传入
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)

// 函数方式,或者集合方式
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }
val sourceList = mutableListOf(1, 2, 3)
val copyList = sourceList.toMutableList()
val readOnlyCopyList = sourceList.toList()
sourceList.add(4)

2.序列

// 挨个传入
val numbersSequence = sequenceOf("four", "three", "two", "one")

// 集合转换过去
val numbers = listOf("one", "two", "three", "four")
val numbersSequence = numbers.asSequence()

// 函数转换
val oddNumbers = generateSequence(1) { it + 2 } // `it` 是上一个元素
println(oddNumbers.take(5).toList())

当然,构造方法不止这些,这里也只是粗略对比。

处理元素:

集合

假定有一个单词列表。下面的代码过滤长于三个字符的单词,并打印前四个单词的长度。

val words = "The quick brown fox jumps over the lazy dog".split(" ")
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
    .map { println("length: ${it.length}"); it.length }
    .take(4)

println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList)
filter: The
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
length: 5
length: 5
length: 5
length: 4
length: 4
Lengths of first 4 words longer than 3 chars:
[5, 5, 5, 4]

运行此代码时,会看到 filter() 与 map() 函数的执行顺序与代码中出现的顺序相同。 首先,将看到 filter:对于所有元素,然后是 length:对于在过滤之后剩余的元素,然后是最后两行的输出。 列表处理如下图:

List processing

 序列

现在用序列写相同的逻辑:

val words = "The quick brown fox jumps over the lazy dog".split(" ")
// 将列表转换为序列
val wordsSequence = words.asSequence()

val lengthsSequence = wordsSequence.filter { println("filter: $it"); it.length > 3 }
    .map { println("length: ${it.length}"); it.length }
    .take(4)

println("Lengths of first 4 words longer than 3 chars")
// 末端操作:以列表形式获取结果。
println(lengthsSequence.toList())
Lengths of first 4 words longer than 3 chars
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
[5, 5, 5, 4]

此代码的输出表明,仅在构建结果列表时才调用 filter() 与 map() 函数。 因此,首先看到文本 “Lengths of..” 的行,然后开始进行序列处理。 请注意,对于过滤后剩余的元素,映射在过滤下一个元素之前执行。 当结果大小达到 4 时,处理将停止,因为它是 take(4) 可以返回的最大大小。

序列处理如下图:

Sequences processing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值