由于您使用的是 Kotlin,因此您拥有不可变数据类型和函数而没有副作用的优势。以下是如何通过使用fold(),在不向外部公开任何状态的函数中使用不可变列表来做到这一点:
val originalList = listOf("1", "2", "3", ".", "4", ".")
val (filteredList, _) = originalList.fold(
Pair(emptyList<String>(), false)
) { (newList, found), item ->
if (item == "." && !found) Pair(newList + item, true)
else if (item == ".") Pair(newList, true)
else Pair(newList + item, found)
}
println(filteredList)
结果:
[1, 2, 3, ., 4]
fold() 获取一个初始累加器值,然后将函数应用于列表的每个元素,同时更新累加器。
在这里,我们将累加器设置为空列表的 Pair,我们将在其中构建新列表和一个布尔值,以跟踪我们是否已经看到 .。
对于原始列表的每个元素,我们返回一个新的对,将项目添加到新列表(如果需要)并更新我们是否已经看到.。 newList + item 不会将该项目添加到不可变列表中,它会返回一个新的不可变列表,其中附加了该项目。因为如果我们已经看到 . 作为对的一部分到每次迭代,我们就会传递 Bool 跟踪,因此不需要函数外部的临时变量来跟踪它。
最后,因为累加值是Pair,所以我们使用destructuring只提取与val (filteredList, _) = pair的pair的累加列表(第一个值)。
对于您的列表,返回的 Pair 值将如下所示:
([1], false)
([1, 2], false)
([1, 2, 3], false)
([1, 2, 3, .], true)
([1, 2, 3, ., 4], true)
([1, 2, 3, ., 4], true)