Kotlin windowedSequence用法及代码示例

本文方法及代码示例基于Kotlin 2.1.20 Released

windowedSequence 所在包 kotlin.text.windowedSequence,其相关用法介绍如下:

用法一

kotlin 复制代码
fun CharSequence.windowedSequence(
    size: Int, 
    step: Int = 1, 
    partialWindows: Boolean = false
): Sequence<String>

返回给定 size 的窗口的快照序列,沿此字符序列滑动给定的 step ,其中每个快照都是一个字符串。

最后几个字符串的字符数可能少于给定的 size

sizestep 都必须为正数,并且可以大于此字符序列中的元素数。

示例代码:

kotlin 复制代码
import kotlin.test.*

fun main(args: Array<String>) {
    //sampleStart
    val sequence = generateSequence(1) { it + 1 }

    val windows = sequence.windowed(size = 5, step = 1)
    println(windows.take(4).toList()) // [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]]

    val moreSparseWindows = sequence.windowed(size = 5, step = 3)
    println(moreSparseWindows.take(4).toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11], [10, 11, 12, 13, 14]]

    val fullWindows = sequence.take(10).windowed(size = 5, step = 3)
    println(fullWindows.toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8]]

    val partialWindows = sequence.take(10).windowed(size = 5, step = 3, partialWindows = true)
    println(partialWindows.toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10], [10]]
    //sampleEnd
}

// 输出
[[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]]
[[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11], [10, 11, 12, 13, 14]]
[[1, 2, 3, 4, 5], [4, 5, 6, 7, 8]]
[[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10], [10]]

参数说明

size- 每个窗口中的元素数量

step- 每一步向前移动窗口的元素数,默认为 1

partialWindows- 控制是否在最后保留部分窗口,如果有的话,默认情况下false这意味着不会保留部分窗口

用法二

kotlin 复制代码
fun <R> CharSequence.windowedSequence(
    size: Int, 
    step: Int = 1, 
    partialWindows: Boolean = false, 
    transform: (CharSequence) -> R
): Sequence<R>

返回将给定的 transform 函数应用于每个字符序列的结果序列,该序列表示给定 size 的窗口上的视图,该窗口使用给定的 step 沿着该字符序列滑动。

请注意,传递给transform 函数的字符序列是短暂的,仅在该函数内部有效。您不应该存储它或让它以某种方式逃逸,除非您制作了它的快照。几个最后一个字符序列的字符可能比给定的 size 少。

sizestep 都必须为正数,并且可以大于此字符序列中的元素数。

示例代码:

kotlin 复制代码
import kotlin.test.*

fun main(args: Array<String>) {
    //sampleStart
    val dataPoints = sequenceOf(10, 15, 18, 25, 19, 21, 14, 8, 5)

    val averaged = dataPoints.windowed(size = 4, step = 1, partialWindows = true) { window -> window.average() }
    println(averaged.toList()) // [17.0, 19.25, 20.75, 19.75, 15.5, 12.0, 9.0, 6.5, 5.0]

    val averagedNoPartialWindows = dataPoints.windowed(size = 4, step = 1).map { it.average() }
    println(averagedNoPartialWindows.toList()) // [17.0, 19.25, 20.75, 19.75, 15.5, 12.0]
    //sampleEnd
}

// 输出
[17.0, 19.25, 20.75, 19.75, 15.5, 12.0, 9.0, 6.5, 5.0]
[17.0, 19.25, 20.75, 19.75, 15.5, 12.0]

参数说明

size- 每个窗口中的元素数量

step- 每一步向前移动窗口的元素数,默认为 1

partialWindows- 控制是否在最后保留部分窗口,如果有的话,默认情况下false这意味着不会保留部分窗口

相关方法

相关推荐
wodongx12320 小时前
从零开始部署Android环境的Jenkins CI/CD流水线(docker环境,Win系统)
android·docker·jenkins
loitawu20 小时前
Rockchip平台 Android 11 到 Android 16 系统占用内存对比分析
android·ddr·内存占用·rockhip·android内存
用户20187928316720 小时前
浅谈View经GPU渲染绘制的过程
android
AD钙奶-lalala20 小时前
Android中开一个线程是ULT还是KLT
android
冬天vs不冷21 小时前
Java基础(十四):枚举类详解
android·java·python
2501_915106321 天前
上架 App 全流程解析,iOS 应用上架步骤、App Store 审核流程、ipa 文件上传与测试分发经验
android·ios·小程序·https·uni-app·iphone·webview
补补234561 天前
解决漫步者H180Plus(TypeC)耳机连接三星手机后每次播放音频出现滴滴声
android·音视频·三星·typec·edifier·h180plus·滴滴声
木易 士心1 天前
Android Jetpack Compose 从入门到精通
android·android jetpack
alexhilton1 天前
如何构建Android应用:深入探讨原则而非规则
android·kotlin·android jetpack
2501_916013741 天前
苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验
android·ios·小程序·uni-app·cocoa·iphone·webview