kotlin: sequence的四个特点
一,四个特点:
终端操作才会执行整个操作链: 如果不调用终端操作(如 toList、forEach),则不会执行任何操作;
Sequence 通常是一次性的: 终端操作后不能再次使用,避免重复使用同一 Sequence;
不缓存结果: Sequence 每次遍历都会重新计算,若需复用结果,应先转换为集合(如 toList());
不适合随机访问: Sequence 本质是单向遍历的数据流,不支持 get(index) 操作;
说明:
Sequence 有中间操作和终端操作,如下。
中间操作:每次操作返回一个新的 Sequence 对象
(主要操作有:filter、distinct、drop、take、sorted、sortedDescending、map、mapIndexed、minus 等)。
终端操作:每次操作返回一个值或集合,每个序列只能进行一次终端操作
(主要操作有:forEach、joinToString、min、max、count、sum、average、any、first、last、reduce 等)。
二,例子:有终端操作时,代码才会被执行
代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
//从现有集合转换
val list = listOf(1, 2, 3, 4)
val seq1 = list.asSequence()
println("seq1")
//没有终端操作,map中代码不会被执行
seq1.map{
println("map1当前数字:"+it)
it*2
}
//有终端操作,map中代码会被执行
seq1.map{
println("map2当前数字:"+it)
it*2
}.forEach {
println(it)
}
//原sequence中的数据未改变
println(seq1.toList())
}
运行结果:
三,例子:保存结果到list
代码:
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
//使用 sequenceOf 函数
val seq2 = sequenceOf(1, 2, 3, 4)
//保存到list
val list2 = seq2.map{
println("map2当前数字:"+it)
it*2
}.toList()
//seq2中的数据没改变
println("seq2")
seq2.forEach(::println)
//list2中保存了处理过的数据
println("list2:"+list2)
}
}
运行结果: