2016-03-07 59 views
1

我目前正在嘗試學習Scala並強制我儘可能地使用函數式編程風格來處理。斯卡拉「takeWhile」流量混淆

下面的代碼有我不明白一個流程:

object Testing { 
    def XForm(i: Int) = { 
     println(i) 
     if (i < 3) "%d".format(i * i) else "" 
    } 

    def main(args: Array[String]) { 
     print(Range(0, 6).map(XForm).takeWhile(_.nonEmpty)) 
    } 
} 

輸出如下:

0 
1 
2 
3 
4 
5 
Vector(0, 1, 4) 

爲什麼呼籲值4和5 XForm?我認爲使用takeWhile(比較過濾)的'循環'在第一次錯誤發生時被終止?

如何以不同的(功能樣式)方式解決此問題?

回答

2

mapRange嚴格,因此立即進行評估。也就是說,如果你刪除takeWhile,你將看到的一切評估之前,你甚至去當takeWhile會發生:

scala> Range(0, 6).map(XForm) 
0 
1 
2 
3 
4 
5 
res1: scala.collection.immutable.IndexedSeq[String] = Vector(0, 1, 4, "", "", "") 

您可以通過使用一個view,這將延遲計算集合解決這個問題。

scala> Range(0, 6).view.map(XForm).takeWhile(_.nonEmpty).force 
0 
1 
2 
3 
res4: Seq[String] = Vector(0, 1, 4) 
+0

我在最後使用'force'只是爲了顯示結果,但您可以依靠簡單地訪問結果來強制評估。 –