侧边栏壁纸
  • 累计撰写 416 篇文章
  • 累计创建 65 个标签
  • 累计收到 145 条评论

目 录CONTENT

文章目录

Kotlin 序列 Sequence

Z同学
2021-09-24 / 0 评论 / 0 点赞 / 6,749 阅读 / 2,093 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

[TOC]

前言

序列是kotlin 标准库提供的另外一种容器类型。使用 Swquence<T>.主要是用来进行多步骤集合处理。

Sequence 对每个元素逐个执行所有处理步骤。避免中间步骤的结果,从而提高了整个集合处理链的性能,但是序列有延迟性质。建议在处理较小的集合或者进行简单计算时使用。

初始化

创建序列需要使用公共库的sequenceOf()函数。

示例:

fun main(string: Array<String>) {
    //创建一个简单的序列
    var sequen = sequenceOf("a", "b", "c", "d", "e")
    // 也可以通过 list 或则Set 进行创建
    val list = listOf("z", "x", "y")
    var sequen1 = list.asSequence()

    //函数 generateSequence() 创建无限序列
    val oo = generateSequence(1) {
        it + 2 //返回null时 序列停止生成,  当前模式没有返回 则序列无限。 it 是上一次的参数结果
    }
    //函数 generateSequence() 创建有限序列
    val o1 = generateSequence(1) {
        if (it + 2 < 10) it + 2 else null  //创建有限序列
    }

    //使用 yield 创建序列
    val oddNumbers = sequence {
        yield(1) //返回一个序列 值
        yieldAll(listOf(3, 5)) //返回多个序列值
        yieldAll(generateSequence(7) { it + 2 })  //返回多个序列值
    }
    println(oddNumbers.take(10).toList())
}
//输出
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

操作

针对序列的操作可以分为两种类型:

  • 无状态操作:不需要状态,并且可以独立处理每个元素,例如map(),filter()。无状态操作还可能需要少量常数个状态来处理元素。例如 take()drop()
  • 有状态操作:需要大量状态, 通常与序列中元素的数量成比例。

如果序列操作,返回延迟生成一个另外序列,则该序列称为:中间序列

否则就是末端操作,末端操作通常是使用toList()或者sum()。 只有通过末端操作才能检索序列元素。

序列可以多次迭代,但是某些序列实现可能会约束自己只能迭代一次。

示例:序列与列表对象的处理

fun main(string: Array<String>) {
    //获取 前四个参数
    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("获取前四个长度大于3的单词:${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
获取前四个长度大于3的单词:[5, 5, 5, 4]

可以看到运行逻辑是,执行完毕filter 然后再执行map。

整个处理逻辑是:

总共花费了23个步骤。

如果是序列:

示例:

fun main(string: Array<String>) {
    //获取 前四个参数
    val words = "The quick brown fox jumps over the lazy dog".split(" ").asSequence()
    val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
        .map { println("length: ${it.length}"); it.length }
        .take(4)
    println("获取前四个长度大于3的单词:${lengthsList.toList()}")
}
//输出:
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
获取前四个长度大于3的单词:[5, 5, 5, 4]

序列处理只需要 18 个步骤

序列是根据末端操作,进行处理的。所以序列可以是无限长度。

0

评论区