【Kotlin】Sequence简介

1 前言

序列(Sequence)是 Kotlin 中为方便操作++集合及其元素++而定制的接口,是一个延迟获取数据的集合,只有需要元素时才会生产元素。在处理大量数据时,序列可以显著地提升性能。

Sequence 类似 Java 中的 Stream,详见 → Stream 总结。Sequence 有中间操作和终端操作,如下。

  • 中间操作:每次操作返回一个新的 Sequence 对象(主要操作有:filter、distinct、drop、take、sorted、sortedDescending、map、mapIndexed、minus 等)。
  • 终端操作:每次操作返回一个值或集合,每个序列只能进行一次终端操作(主要操作有:forEach、joinToString、min、max、count、sum、average、any、first、last、reduce 等)。

2 Sequence 的创建

2.1 sequenceOf

Kotlin 复制代码
var sequence = sequenceOf(1, 2, 3)

2.2 asSequence

1)IntRange

Kotlin 复制代码
var intRange = 1..10
var sequence = intRange.asSequence()

2)Array

Kotlin 复制代码
var array = arrayOf(1, 2, 3)
var sequence = array.asSequence()

3)List

Kotlin 复制代码
var list = listOf("AA", "BBB", "CC")
var sequence = list.asSequence()

4)Set

Kotlin 复制代码
var set = setOf("AA", "BBB", "CC")
var sequence = set.asSequence()

2.3 BufferedReader

Kotlin 复制代码
val reader = BufferedReader(FileReader("G:\\stream.txt"))
val sequence = reader.lineSequence()

2.4 generateSequence

Kotlin 复制代码
var sequence = generateSequence(arrayOf(1, 1)) { arr ->
		arrayOf(arr[1], arr[0] + arr[1])
	}
	.take(10)
	.map { arr -> arr[0] }
// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
println(sequence.joinToString())

3 Sequence 的中间操作

3.1 主要接口

Kotlin 复制代码
// 过滤
public fun <T> Sequence<T>.filter(predicate: (T) -> Boolean): Sequence<T>
// 去重
public fun <T> Sequence<T>.distinct(): Sequence<T>
// 丢弃前 n 个元素
public fun <T> Sequence<T>.drop(n: Int): Sequence<T>
// 截取前 n 个元素
public fun <T> Sequence<T>.take(n: Int): Sequence<T>
// 排序(升序)
public fun <T : Comparable<T>> Sequence<T>.sorted(): Sequence<T>
// 排序(降序)
public fun <T : Comparable<T>> Sequence<T>.sortedDescending(): Sequence<T>
// 映射(T -> R)
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
// 映射(index, T -> R)
public fun <T, R> Sequence<T>.mapIndexed(transform: (index: Int, T) -> R): Sequence<R>
// 删除序列中第一个 element
public operator fun <T> Sequence<T>.minus(element: T): Sequence<T>

3.2 案例

Kotlin 复制代码
fun main() {
    var sequence = sequenceOf(4, 9, 1, 8, 5, 5, 7, 3, 6, 2)
    sequence.filter { e -> e > 2 && e < 8 } // 4 5 5 7 3 6
        .distinct() // 4 5 7 3 6
        .drop(1) // 5 7 3 6
        .take(3) // 5 7 3
        .sorted() // 3 5 7
        .map { e -> e * e } // 9 25 49
        .forEach(::println)
}

4 Sequence 的终端操作

4.1 主要接口

1)统计函数

Kotlin 复制代码
// 最小值
public fun <T : Comparable<T>> Sequence<T>.min(): T?
// 最大值
public fun <T : Comparable<T>> Sequence<T>.max(): T?
// 元素个数
public fun <T> Sequence<T>.count(): Int
// 求和
public fun Sequence<Int>.sum(): Int
// 求平均值
public fun Sequence<Int>.average(): Double
// 序列中是否有元素
public fun <T> Sequence<T>.any(): Boolean
// 获取第一个元素
public fun <T> Sequence<T>.first(): T
// 获取最后一个元素
public fun <T> Sequence<T>.last(): T

2)遍历元素

Kotlin 复制代码
// 遍历元素
public inline fun <T> Sequence<T>.forEach(action: (T) -> Unit): Unit

3)拼接元素

Kotlin 复制代码
// 转换为字符串
public fun <T> Sequence<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String

4)规约运算

Kotlin 复制代码
// 规约运算,定义运算 o, result = ((((e1 o e2)) o e3) o e4) o ...
public inline fun <S, T : S> Sequence<T>.reduce(operation: (acc: S, T) -> S): S

5)集合转换

Kotlin 复制代码
public fun <T> Sequence<T>.toList(): List<T>
public fun <T> Sequence<T>.toMutableList(): MutableList<T>
public fun <T> Sequence<T>.toSet(): Set<T>
public fun <T> Sequence<T>.toMutableSet(): MutableSet<T>
public fun <T> Sequence<T>.toHashSet(): HashSet<T>
public fun <T : Comparable<T>> Sequence<T>.toSortedSet(): java.util.SortedSet<T>

4.2 案例

1)统计函数

Kotlin 复制代码
fun main() {
    var sequence = sequenceOf(1, 3, 5)
    var min = sequence.min() // 1
    var max = sequence.max() // 5
    var count = sequence.count() // 3
    var sum = sequence.sum() // 9
    var avg = sequence.average() // 3
    var hasElement = sequence.any() // true
    var first = sequence.first() // 1
    var last = sequence.last() // 5
}

2)遍历元素

Kotlin 复制代码
fun main() {
    var sequence = sequenceOf(1, 3, 5)
    sequence.forEach(::println) // 1、3、5
}

3)拼接元素

Kotlin 复制代码
fun main() {
    var sequence = sequenceOf(1, 3, 5)
    var str = sequence.joinToString(",", "[", "]")
}

4)规约运算

Kotlin 复制代码
fun main() {
    var sequence = sequenceOf(1, 3, 5)
    var sum = sequence.reduce(Integer::sum) // 9
    // 1*1-3*3=-8, (-8)*(-8)-5*5=39
    var res = sequence.reduce { e1, e2 -> e1 * e1 - e2 * e2 } // 39
}

5)集合转换

Kotlin 复制代码
fun main() {
    val sequence = sequenceOf(1, 2, 3)
    var list = sequence.toList()
    var mutableList = sequence.toMutableList()
    var set = sequence.toSet()
    var mutableSet = sequence.toMutableSet()
    var hashSet = sequence.toHashSet()
    var sortedSet = sequence.toSortedSet()
}
相关推荐
Kapaseker13 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker2 天前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker2 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z4 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton5 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream5 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam5 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker6 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
糖猫猫cc6 天前
Kite:两种方式实现动态表名
java·kotlin·orm·kite