Java & Groovy & Scala & Kotlin - 12.循環(huán)

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 中有 whiledo..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 一致媒至,也有 forfor-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 支持基本的 whiledo-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ǔ)言不同贰锁,其并沒有提供 breakcontinue 作為關(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ǔ)言都支持 breakcontinue,Scala 則必須使用 Breaks 工具類

文章源碼見 https://github.com/SidneyXu/JGSK 倉(cāng)庫(kù)的 _12_loop 小節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掩幢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子上鞠,更是在濱河造成了極大的恐慌际邻,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芍阎,死亡現(xiàn)場(chǎng)離奇詭異世曾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門轮听,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骗露,“玉大人,你說我怎么就攤上這事血巍∠麸保” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵述寡,是天一觀的道長(zhǎng)柿隙。 經(jīng)常有香客問我,道長(zhǎng)鲫凶,這世上最難降的妖魔是什么禀崖? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮螟炫,結(jié)果婚禮上波附,老公的妹妹穿的比我還像新娘。我一直安慰自己昼钻,他們只是感情好掸屡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著换吧,像睡著了一般折晦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沾瓦,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天满着,我揣著相機(jī)與錄音,去河邊找鬼贯莺。 笑死风喇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缕探。 我是一名探鬼主播魂莫,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爹耗!你這毒婦竟也來(lái)了耙考?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤潭兽,失蹤者是張志新(化名)和其女友劉穎倦始,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山卦,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞋邑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚碗。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逾一,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肮雨,到底是詐尸還是另有隱情遵堵,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布酷含,位于F島的核電站鄙早,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椅亚。R本人自食惡果不足惜限番,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呀舔。 院中可真熱鬧弥虐,春花似錦、人聲如沸媚赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惧磺。三九已至颖对,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磨隘,已是汗流浹背缤底。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留番捂,地道東北人个唧。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像设预,于是被迫代替她去往敵國(guó)和親徙歼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多鳖枕,快來(lái) Kotlin 魄梯,快速學(xué)習(xí)Kotlin! 什么是Kotlin宾符? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,218評(píng)論 9 118
  • 循環(huán)簡(jiǎn)介 循環(huán)可以用于讓一個(gè)程序重復(fù)地執(zhí)行語(yǔ)句画恰。 循環(huán)是用來(lái)控制語(yǔ)句塊重復(fù)執(zhí)行的一種結(jié)構(gòu)。 循環(huán)的概念是程序設(shè)計(jì)的...
    Vinfai閱讀 1,167評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法吸奴,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法则奥,異常的語(yǔ)法考润,線程的語(yǔ)...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,335評(píng)論 0 85
  • 一直想自己寫些東西可是礙于自己可憐的智商和文采,所以從未付諸實(shí)施读处!今天糊治,就把這里當(dāng)做自己說心里話我記錄心情的好地方吧
    依佳閱讀 201評(píng)論 0 0