首页 > 解决方案 > 为什么我不能在 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 上测试)

标签: kotlinsequencefindall

解决方案


findAll()返回一个Sequence<MatchResult>。Sequence 上的操作分为中间终端。函数的文档声明了它们的类型。map并且onEach是中间的。他们的行动被推迟到进行终端操作。forEach是终端。

操作序列map返回一个新序列,该序列仅在实际迭代时执行映射函数,例如通过调用forEach或在 for 循环中使用它。

这就是 Sequence 的目的,以推迟变异函数调用。它可以减少中间列表的分配,或者在某些情况下避免对每个项目应用突变,例如如果链中的终端调用是find()调用。


推荐阅读