我使用 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 上測驗)
uj5u.com熱心網友回復:
findAll()回傳一個Sequence<MatchResult>. 對 Sequence 的操作分為中間或終端。函式的檔案宣告了它們的型別。map并且onEach是中間的。他們的行動被推遲到進行終端操作。forEach是終端。
使用 Sequence 操作map回傳一個新的 Sequence ,該新 Sequence 僅在實際迭代時才執行映射功能,例如通過呼叫forEach或在 for 回圈中使用它。
這就是 Sequence 的目的,推遲變異函式呼叫。它可以減少中間串列的分配,或者在某些情況下避免在每個專案上應用突變,例如如果鏈中的終端呼叫是find()呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/339708.html
