kotlin - 为什么我不能在 Kotlins 正则表达式结果序列上使用 map
问题描述
我使用 Kotlin 的 Regex API 来获得一些正则表达式的出现。我想将发现直接转换为另一个对象,因此我直观地map()
在结果序列上使用。
我很惊讶该map
函数从未被调用但forEach
正在工作。这个例子应该清楚地表明:
val regex = "a.".toRegex()
val txt = "abacad"
var counter = 0
regex.findAll(txt).forEach { counter++ }
println(counter) // 3
regex.findAll(txt).map { counter++ }
println(counter) // still 3 since map is not called
regex.findAll(txt).forEach { counter++ }
println(counter) // 6
我的问题是为什么?我在文档中监督了吗?
(在 Kotlin 1.5.30 上测试)
解决方案
findAll()
返回一个Sequence<MatchResult>
。Sequence 上的操作分为中间或终端。函数的文档声明了它们的类型。map
并且onEach
是中间的。他们的行动被推迟到进行终端操作。forEach
是终端。
操作序列map
返回一个新序列,该序列仅在实际迭代时执行映射函数,例如通过调用forEach
或在 for 循环中使用它。
这就是 Sequence 的目的,以推迟变异函数调用。它可以减少中间列表的分配,或者在某些情况下避免对每个项目应用突变,例如如果链中的终端调用是find()
调用。
推荐阅读
- algorithm - 如何有效地解决矩阵可达性递归问题?
- javascript - 在匹配输入长度时触发选项卡事件
- java - 如何在传统的 JavaFX 游戏循环中正确实现 handleInput()?
- r - 具有频率和百分比的双向列联表
- python - Maya Pyside2 UI,无法让 QPushButton 与同一类中的函数连接
- php - 如果 php 包含的文件失败,站点中断(不会渲染得更远),我可以以某种方式阻止这种情况吗?
- java - 基于现有类和注释生成带有 gradle 任务的源代码
- javascript - 如何获取计算机在 Javascript 中报告的时间(不考虑时区、DST 等)?
- css - 用 px 确定背景图像高度
- delphi - 什么是 TFDDatSRow?