首页 > 其他分享 >【Kotlin】Sequence简介

【Kotlin】Sequence简介

时间:2024-04-10 22:02:06浏览次数:23  
标签:元素 sequence Kotlin Sequence var 简介 fun public

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

var sequence = sequenceOf(1, 2, 3)

2.2 asSequence

1)IntRange

var intRange = 1..10
var sequence = intRange.asSequence()

2)Array

var array = arrayOf(1, 2, 3)
var sequence = array.asSequence()

3)List

var list = listOf("AA", "BBB", "CC")
var sequence = list.asSequence()

4)Set

var set = setOf("AA", "BBB", "CC")
var sequence = set.asSequence()

2.3 BufferedReader

val reader = BufferedReader(FileReader("G:\\stream.txt"))
val sequence = reader.lineSequence()

2.4 generateSequence

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 主要接口

// 过滤
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 案例

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)统计函数

// 最小值
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)遍历元素

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

3)拼接元素

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

4)规约运算

// 规约运算,定义运算 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)集合转换

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)统计函数

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)遍历元素

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

3)拼接元素

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

4)规约运算

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)集合转换

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()
}

​ 声明:本文转自【Kotlin】Sequence简介

标签:元素,sequence,Kotlin,Sequence,var,简介,fun,public
From: https://www.cnblogs.com/zhyan8/p/18115109

相关文章

  • 【Kotlin】匿名类和伴生类
    1匿名类​1)无继承funmain(){varobj=object{varname:String="zhang"overridefuntoString():String{returnname}}println(obj)//zhang}​2)有继承funmain(){varobj=object......
  • 【Kotlin】委托模式
    1委托模式简介​委托模式的类图结构如下。​对应的Kotlin代码如下。funmain(){varbaseImpl=BaseImpl()varbaseWrapper=BaseWrapper(baseImpl)baseWrapper.myFun1()//打印:BaseImpl,myFun1baseWrapper.myFun2()//打印:BaseImpl,......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • 汇编语言简易教程(1):简介
    汇编语言简易教程(1):简介本教程完全来自于学习asseble64时的读书笔记,因为原书是英文版且缺少翻译,因此本教程也可以作为原书的导读.WhatisAssemblyLanguage具体机器架构相关,在不同的架构上,指令会有差异(复杂指令集/精简指令集)低级语言(这里的低级指的是......
  • 【Kotlin】Array简介
    1源码publicclassArray<T>{publicvalsize:Intpublicinlineconstructor(size:Int,init:(Int)->T)publicoperatorfunget(index:Int):T//重载a[i]运算符publicoperatorfunset(index:Int,value:T):Unit//重载a[i]=x运算符pu......
  • 【Kotlin】List、Set、Map简介
    1List​Java的List、Set、Map介绍见→Java容器及其常用方法汇总。1.1创建List1.1.1emptyListvarlist=emptyList<String>()//创建空List1.1.2List构造函数varlist1=List(3){"abc"}//[abc,abc,abc]varlist2=ArrayList<Int>()varlist3=......
  • CF1097H Mateusz and an Infinite Sequence
    这种模非常小的数意义下的递归结构的区间查询显然可以抽象为\(O(d\log_{d}V)\)次信息的合并,问题的关键在于如何快速的处理信息的合并。一个非常\(\text{trival}\)的想法是每次合并时直接计算跨过分界点的区间个数,但这个严格不弱于通配符匹配问题,直接使用卷积只能做到\(O(nm......
  • Dockerfile简介
      1.什么是dockerfiledockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。2.Dockerfile构建过程解析dockerfile构建过程解析:  Docker执行Dockerfile的大致流程:    ......
  • Dockerfile 保留字 简介
       FROM基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROMMAINTAINER:RUNEXPOSE:当前容器对外暴露出的端口。WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点ENV:......
  • D. Inaccurate Subsequence Search
    原题链接题解明确每个变量的意义code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lla[200005];intmain(){llt;cin>>t;while(t--){map<ll,ll>b;//b[x]代表数组b中x的使用情况,大于0代表还有剩余,等于0代表刚好借满......