這篇文章主要講解了“scala的For表達式怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“scala的For表達式怎么使用”吧!
Scala 提供一個輕量級的標記方式用來表示 序列推導。推導使用形式為 for (enumerators) yield e 的 for 表達式,此處 enumerators 指一組以分號分隔的枚舉器。一個 enumerator 要么是一個產生新變量的生成器,要么是一個過濾器。for 表達式在枚舉器產生的每一次綁定中都會計算 e 值,并在循環結束后返回這些值組成的序列。
看下例:
case class User(name: String, age: Int)val userBase = List(User("Travis", 28),User("Kelly", 33),User("Jennifer", 44),User("Dennis", 23))val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))yield user.nametwentySomethings.foreach(name => println(name))
這里 for 循環后面使用的 yield 語句實際上會創建一個 List。因為當我們說 yield user.name 的時候,它實際上是一個 List[String]。user <- userBase 是生成器,if (user.age >=20 && user.age < 30) 是過濾器用來過濾掉那些年齡不是20多歲的人。
下面這個例子復雜一些,使用了兩個生成器。它計算了 0 到 n-1 的所有兩兩求和為 v 的數字的組合:
def foo(n: Int, v: Int) =for (i <- 0 until n;j <- i until n if i + j == v)yield (i, j)foo(10, 10) foreach {case (i, j) =>println(s"($i, $j) ")}
這里 n == 10 和 v == 10。在第一次迭代時,i == 0 并且 j == 0 所以 i + j != v 因此沒有返回值被生成。在 i 的值遞增到 1 之前,j 的值又遞增了 9 次。如果沒有 if 語句過濾,上面的例子只會打印出如下的結果:
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 1) ...
注意 for 表達式并不局限于使用列表。任何數據類型只要支持 withFilter,map,和 flatMap 操作(不同數據類型可能支持不同的操作)都可以用來做序列推導。
你可以在使用 for 表達式時省略 yield 語句。此時會返回 Unit。當你想要執行一些副作用的時候這很有用。下面的例子輸出和上面相同的結果,但是沒有使用 yield:
def foo(n: Int, v: Int) =for (i <- 0 until n;j <- i until n if i + j == v)println(s"($i, $j)")foo(10, 10)
感謝各位的閱讀,以上就是“scala的For表達式怎么使用”的內容了,經過本文的學習后,相信大家對scala的For表達式怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。