您好,登錄后才能下訂單哦!
這篇文章主要講解了“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.name
twentySomethings.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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。