scala之for循環(huán)
scala之for循環(huán)的幾種方式
第一種
i 表示循環(huán)的變量, <- 規(guī)定好 to 規(guī)定
i 將會從 1-3 循環(huán), 前后閉合
for(i <- 1 to 3){
print(i + " ")
}
第二種
這種方式和前面的區(qū)別在于 i 是從1 到 3-1
前閉合后開的范圍,和java的arr.length() 類似
for(i <- 1 until 3) {
print(i + " ")
}
第三種(循環(huán)守衛(wèi))
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}
這個代碼等價于
for (i <- 1 to 3) {
if (i != 2) {
println(i+"")
}
}
第四種(引入變量)
for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
}
沒有關鍵字,所以范圍后一定要加;來隔斷邏輯
上面的代碼等價
for ( i <- 1 to 3) {
val j = 4 –i
print(j+"")
}
第五種(嵌套循環(huán))
for(i <- 1 to 3; j <- 1 to 3) {
println(" i =" + i + " j = " + j)
}
上面的代碼等價于
for ( i <- 1 to 3) {
for ( j <- 1to 3){
println(i + " " + j + " ")
}
}
第六種(循環(huán)返回值)
將遍歷過程中處理的結(jié)果返回到一個新Vector集合中,使用yield關鍵字
val res = for(i <- 1 to 10) yield i
println(res)
第七種(會用花括號代替小括號)
{}和()對于for表達式來說都可以
for 推導式有一個不成文的約定:當for 推導式僅包含單一表達式時使用圓括號,當其包含多個表達式時使用大括號
當使用{} 來換行寫表達式時,分號就不用寫了
for(i <- 1 to 3; j = i * 2) {
println(" i= " + i + " j= " + j)
}
注意
scala中去掉了break和continue,所以需要專門的中斷語句去執(zhí)行
break()函數(shù)替代break,用breakable()將代碼塊包起來,可以讓break()函數(shù)后的代碼可以繼續(xù)執(zhí)行
循環(huán)守衛(wèi)替代continue
import util.control.Breaks._
object Demo {
var n = 1;
while (true){
n += 1
if (n === 18){
//在scala中使用函數(shù)式的break函數(shù)中斷循環(huán)
//def break(): Nothing = { throw breakException }
//這樣就導致后面的代碼不會被執(zhí)行,這時可以用breakable去處理
break();
}
}
}
import util.control.Breaks._
object WhileBreak {
def main(args: Array[String]): Unit = {
var n = 1
//breakable()函數(shù)
//說明
//1. breakable 是一個高階函數(shù):可以接收函數(shù)的函數(shù)就是高階函數(shù)
//2. def breakable(op: => Unit) {
// try {
// op
// } catch {
// case ex: BreakControl =>
// if (ex ne breakException) throw ex
// }
// }
// (1) op: => Unit 表示接收的參數(shù)是一個沒有輸入,也沒有返回值的函數(shù)
// (2) 即可以簡單理解可以接收一段代碼塊
// 3. breakable 對break()拋出的異常做了處理,代碼就繼續(xù)執(zhí)行
// 4. 當我們傳入的是代碼塊,scala程序員會將() 改成{}
breakable {
while (n <= 20) {
n += 1
println("n=" + n)
if (n == 18) {
// 使用函數(shù)式的break函數(shù)中斷循環(huán)
break()
}
}
}
}
}
使用循環(huán)守衛(wèi)終端
var loop = true
var sum2 = 0
for (i <- 1 to 100 if loop == true) {
sum2 += i
if (sum2 > 20) {
println("循環(huán)守衛(wèi)實現(xiàn)中斷 第一次大于20的當前數(shù)=" + i)
loop = false
}
println("i=" + i)
}
使用循環(huán)守衛(wèi)控制步長
for (i <- Range(1,10,2)){
println(s"i=${i}")
}
for (i <- 1 to 10 if i % 2 == 1) {
println("i=" + i)
}
總結(jié)
scala 的for循環(huán)形式和java是較大差異,這點請注意,但是基本的原理還是一樣的。
1、Scala里面沒有++ --的操作,如果非要實現(xiàn)類似的操作,那么使用的是 a -= 1操作
2、for循環(huán)的語法是 (for <- 表達式/集合/數(shù)組,常用的表達式 1 to 10 或 1 until 10 )
3、for循環(huán)支持多重for循環(huán),可以寫if條件表達式,并且表達式之前沒有分號
4、for循環(huán)有返回值或者返回來一個新的集合在循環(huán)體前使用關鍵字yield
5、for循環(huán)中斷用breakable高階函數(shù)
歡迎關注全棧開發(fā)私房菜,每天進步一點點
長按二維碼關注【全棧開發(fā)私房菜】
