Overview
本節(jié)主要介紹各種循環(huán)語(yǔ)句
Java 篇
For
for
語(yǔ)句可以說是最常用的循環(huán)語(yǔ)句了卦睹。Java 支持普通的 for
語(yǔ)句以及增強(qiáng)型的 for-each
語(yǔ)句陵珍。
for 語(yǔ)句
for (int i = 0; i < 3; i++) {
System.out.println("Repeat For " + i);
}
for-each 語(yǔ)句
int[] arr = {1, 2, 3};
for (int a : arr) {
System.out.println("Repeat For-Each " + a);
}
While
while
是另一種常用的循環(huán)語(yǔ)句,在 Java 中有 while
和 do..while
兩種形式贮缅。
while
while (i < arr.length) {
System.out.println("Repeat While " + arr[i++]);
}
do...while
do {
i++;
System.out.println("Repeat Do-While " + i);
} while (i < arr.length);
Continue 和 Break
Continue 和 Break 關(guān)鍵字用于進(jìn)行流程控制。Continue 用于跳過本次循環(huán),直接進(jìn)入下次循環(huán)摸屠。Break 則用于跳出當(dāng)前循環(huán)景埃。
Continue
例:
for (int i : Arrays.asList(1, 2, 3, 4, 5)) {
if (i == 3) continue;
System.out.println("Continue " + i); // 1 2 4 5
}
Break
例:
for (int i : Arrays.asList(1, 2, 3, 4, 5)) {
if (i == 3) break;
System.out.println("Break " + i); // 1 2
}
Groovy 篇
For
Groovy 中的 for
語(yǔ)句基本與 Java 一致媒至,也有 for
和 for-each
兩種形式。
例:
for (def i = 0; i < 3; i++) {
println "Repeat For ${i}"
}
def arr = [1, 2, 3]
for (def a : arr) {
println("Repeat For-Each ${a}")
}
While
Groovy 只有 while
語(yǔ)句谷徙,沒有 do..while
語(yǔ)句拒啰。
例:
while (i < arr.size()) {
println("Repeat While ${arr[i++]}")
}
Range
Groovy 中有一個(gè) Java 中沒有的概念:Range。Range 表示一個(gè)有序的序列完慧,結(jié)合 for
語(yǔ)句可以形成更加簡(jiǎn)便谋旦,直觀的循環(huán)語(yǔ)句。
構(gòu)造一個(gè) Range 對(duì)象非常簡(jiǎn)單屈尼,只要你使用 n1..n2
這樣的表達(dá)式就可以表示一個(gè)簡(jiǎn)單的 Range 對(duì)象册着。
例:
以下例子表示從 0 循環(huán)到 3,默認(rèn)每次步長(zhǎng)為1脾歧,左右都是閉區(qū)間
for (a in 0..3) {
println "Repeat Range ${a}"
}
當(dāng)然倒序也是可以的甲捏,步長(zhǎng)被默認(rèn)指定為為 -1。
for (a in 3..0) {
println "Repeat Reverse-Range ${a}"
}
?```language
也可以通過 n1..<n2
這樣的語(yǔ)法來(lái)指定左閉右開鞭执。
for (a in 0..<3) {
println "Repeat Range ${a}"
}
Continue 和 Break
用法同 Java司顿。
Continue
例:
for (i in 1..5) {
if (i == 3) continue
println("Continue $i")
}
Break
例:
for (i in 1..5) {
if (i == 3) break
println("Break $i")
}
Scala 篇
For
Scala 的 for
語(yǔ)句與其它語(yǔ)言都不同,沒有最基本的 C 風(fēng)格的 for (;;)
語(yǔ)句兄纺,但是卻有類似的 for-each
語(yǔ)句大溜。
例:
val arr = Array(1, 2, 3)
for (a <- arr) {
println(s"Repeat For-Each $a")
}
也可以基于索引進(jìn)行遍歷
for (i <- arr.indices) {
println(s"Repeat For-Each ${arr(i)}")
}
While
Scala 支持基本的 while
和 do-while
語(yǔ)句。
while
val arr = Array(1, 2, 3)
var i = 0
while (i < arr.length) {
println(s"Repeat While ${arr(i)}") i += 1
}
do-while
do {
i += 1
println(s"Repeat While $i")
} while (i < 5)
Power For
Range
同 Groovy 一樣估脆,Scala 更高級(jí)的 for
循環(huán)也是通過 Range
對(duì)象來(lái)實(shí)現(xiàn)的钦奋。
Scala 使用方法 to()
和 until()
來(lái)創(chuàng)建 for
循環(huán),后者是前者的倒序形式,且使用 for
循環(huán)時(shí)循環(huán)變量無(wú)需預(yù)先定義锨苏,直接使用就可以了疙教。
For-To
例:
for (i <- 0 to 3) {
println(s"Repeat For $i") // 0 1 2 3
}
因?yàn)?Scala 一切皆對(duì)象,所以以上的 0 to 3
實(shí)際方法 0.to(3)
簡(jiǎn)寫形式伞租,且循環(huán)變量 i
無(wú)需預(yù)先定義為 var i
贞谓。
For-Until
for (i <- 0 until 3) {
println(s"Repeat For-Until $i") // 0 1 2
}
指定步長(zhǎng)
使用關(guān)鍵字 by
可以在循環(huán)時(shí)指定步長(zhǎng)
for (i <- 0 to 5 by 2) {
println(s"Repeat For $i")
}
此外,Scala 在一個(gè) for
循環(huán)中可以同時(shí)對(duì)多個(gè)變量進(jìn)行循環(huán)葵诈,每個(gè)變量間以符號(hào) ;
進(jìn)行分隔裸弦。
for (i <- 0 to 3; j <- 2 to 4) {
println(s"Repeat For $i, $j")
}
Guard
Scala 的 for
循環(huán)中可以插入 if
語(yǔ)句用于在循環(huán)中進(jìn)行一些邏輯判斷,這種 if
語(yǔ)句被稱作為 "guard"(守護(hù)者)作喘。
例:
val list = List(1, 2, 3)
for (i <- list if i != 2; if i > 1) {
println(s"Repeat with Guard $i")
}
Yield
yield
用于從 for
循環(huán)抽取所有符合特定條件的值理疙,這種 for
循環(huán)被稱作為 for 推導(dǎo)式。
例:
val list = List(1, 2, 3)
val ret = for {i <- list
if i != 3
} yield i
println(s"Repeat with Yield $ret")
以上返回結(jié)果 ret
為一個(gè) List
對(duì)象泞坦,其內(nèi)容為所有符合循環(huán)條件的 i
的值窖贤,即 1, 2, 4, 5
。
Continue 和 Break
Scala 和其它語(yǔ)言不同贰锁,其并沒有提供 break
和 continue
作為關(guān)鍵字赃梧。直到 Scala 2.8 以前都必須手動(dòng)實(shí)現(xiàn)這些功能,Scala 2.8 以后引入了 Breaks
工具類可以完成 Continue 和 Break 的功能豌熄。
Breaks
擁有兩個(gè)方法:breakable()
用于定義控制的語(yǔ)句塊授嘀,break()
用于從 breakable()
定義的語(yǔ)句塊中跳出。
Continue
循環(huán)體內(nèi)的 breakable
實(shí)現(xiàn)了 Continue 的功能
例:
for (i <- 1 to 5) {
Breaks.breakable {
if (i == 3) Breaks.break()
println("Continue " + i)
}
}
Break
包裹循環(huán)體的 breakable
實(shí)現(xiàn)了 Break 的功能
例:
Breaks.breakable {
for (i <- 1 to 5) {
if (i == 3) Breaks.break()
println("Break " + i)
}
}
Kotlin 篇
For
同 Scala 一樣锣险,Kotlin 也沒有傳統(tǒng)的 for
語(yǔ)句蹄皱,基本用法同 Scala。
for ( a in arr) {
println("Repeat Power For $a");
}
基于索引
for (i in arr.indices) {
println("Repeat For-indices ${arr[i]}")
}
While
while
語(yǔ)句的用法也與 Scala 相似.
val arr = intArrayOf(1, 2, 3)
var i = 0
while ( i < arr.size ) {
println("Repeat While ${arr[i++]}")
}
i = 0
do {
i++
println("Repeat Do-While $i")
} while (i < 5)
Range
Kotlin 的增強(qiáng)型 for
也基于 Range
對(duì)象芯肤。
for (a in 0..3)
println("Repeat Range $a")
倒序
for (a in 3 downTo 0)
println("Repeat Reverse-Range $a")
指定步長(zhǎng)
for (a in 0..5 step 2)
println("Repeat Range with Step $a")
Repeat
在 Kotlin 中還可以通過 repeat
操作來(lái)實(shí)現(xiàn)重復(fù)指定次數(shù)的操作巷折。
repeat(3) {
println("Repeat $it times")
}
Continue 和 Break
基本用法同 Java
Continue
for (i in 1..5) {
if (i == 3) continue
println("Continue $i")
}
Break
for (i in 1..5) {
if (i == 3) break
println("Break $i")
}
Summary
- Java 與 Groovy 的
for
語(yǔ)句相似,Scala 與 Kotlin 的for
語(yǔ)句相似 - Groovy 不支持
do-while
語(yǔ)句 - 除了 Java 之外崖咨,其它語(yǔ)言都支持基于 Range 的增強(qiáng)型
for
循環(huán) - Scala 的
for
循環(huán)功能最強(qiáng)大 - 除了 Scala 之外盔几,其它語(yǔ)言都支持
break
和continue
,Scala 則必須使用Breaks
工具類
文章源碼見 https://github.com/SidneyXu/JGSK 倉(cāng)庫(kù)的 _12_loop
小節(jié)