Java & Groovy & Scala & Kotlin - 12.循环

Overview

本节主要介绍各种循环语句

Java 篇

For

for 语句可以说是最常用的循环语句了。Java 支持普通的 for 语句以及增强型的 for-each 语句。

for 语句

for (int i = 0; i < 3; i++) {
    System.out.println("Repeat For " + i);
}

for-each 语句

int[] arr = {1, 2, 3};
for (int a : arr) {
    System.out.println("Repeat For-Each " + a);
}

While

while 是另一种常用的循环语句,在 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 关键字用于进行流程控制。Continue 用于跳过本次循环,直接进入下次循环。Break 则用于跳出当前循环。

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 语句基本与 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 语句,没有 do..while 语句。

例:

while (i < arr.size()) {    
  println("Repeat While ${arr[i++]}")
}

Range

Groovy 中有一个 Java 中没有的概念:Range。Range 表示一个有序的序列,结合 for 语句可以形成更加简便,直观的循环语句。

构造一个 Range 对象非常简单,只要你使用 n1..n2 这样的表达式就可以表示一个简单的 Range 对象。

例:

以下例子表示从 0 循环到 3,默认每次步长为1,左右都是闭区间

for (a in 0..3) {    
  println "Repeat Range ${a}"
}

当然倒序也是可以的,步长被默认指定为为 -1。

for (a in 3..0) {    
  println "Repeat Reverse-Range ${a}"
}
​```language

也可以通过 n1..<n2 这样的语法来指定左闭右开。

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 语句与其它语言都不同,没有最基本的 C 风格的 for (;;) 语句,但是却有类似的 for-each 语句。

例:

val arr = Array(1, 2, 3)
for (a <- arr) {  
  println(s"Repeat For-Each $a")
}

也可以基于索引进行遍历

for (i <- arr.indices) {  
  println(s"Repeat For-Each ${arr(i)}")
}

While

Scala 支持基本的 whiledo-while 语句。

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 更高级的 for 循环也是通过 Range 对象来实现的。
Scala 使用方法 to()until() 来创建 for 循环,后者是前者的倒序形式,且使用 for 循环时循环变量无需预先定义,直接使用就可以了。

For-To

例:

for (i <- 0 to 3) {  
  println(s"Repeat For $i") // 0 1 2 3
}

因为 Scala 一切皆对象,所以以上的 0 to 3 实际方法 0.to(3) 简写形式,且循环变量 i 无需预先定义为 var i

For-Until

for (i <- 0 until 3) {  
  println(s"Repeat For-Until $i")   // 0 1 2
}

指定步长

使用关键字 by 可以在循环时指定步长

for (i <- 0 to 5 by 2) {  
  println(s"Repeat For $i")
}

此外,Scala 在一个 for 循环中可以同时对多个变量进行循环,每个变量间以符号 ; 进行分隔。

for (i <- 0 to 3; j <- 2 to 4) {
  println(s"Repeat For $i, $j")
}

Guard

Scala 的 for 循环中可以插入 if 语句用于在循环中进行一些逻辑判断,这种 if 语句被称作为 "guard"(守护者)。

例:

val list = List(1, 2, 3)
for (i <- list if i != 2; if i > 1) {  
  println(s"Repeat with Guard $i")
}

Yield

yield 用于从 for 循环抽取所有符合特定条件的值,这种 for 循环被称作为 for 推导式。

例:

val list = List(1, 2, 3)
val ret = for {i <- list
  if i != 3
} yield i
println(s"Repeat with Yield $ret")

以上返回结果 ret 为一个 List 对象,其内容为所有符合循环条件的 i 的值,即 1, 2, 4, 5

Continue 和 Break

Scala 和其它语言不同,其并没有提供 breakcontinue 作为关键字。直到 Scala 2.8 以前都必须手动实现这些功能,Scala 2.8 以后引入了 Breaks 工具类可以完成 Continue 和 Break 的功能。

Breaks 拥有两个方法:breakable() 用于定义控制的语句块,break() 用于从 breakable() 定义的语句块中跳出。

Continue

循环体内的 breakable 实现了 Continue 的功能

例:

for (i <- 1 to 5) {
  Breaks.breakable {
    if (i == 3) Breaks.break()
    println("Continue " + i)
  }
}

Break

包裹循环体的 breakable 实现了 Break 的功能

例:

Breaks.breakable {
  for (i <- 1 to 5) {
    if (i == 3) Breaks.break()
    println("Break " + i)
  }
}

Kotlin 篇

For

同 Scala 一样,Kotlin 也没有传统的 for 语句,基本用法同 Scala。

for ( a in arr) {    
  println("Repeat Power For $a");
}

基于索引

for (i in arr.indices) {    
  println("Repeat For-indices ${arr[i]}")
}

While

while 语句的用法也与 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 的增强型 for 也基于 Range 对象。

for (a in 0..3)
  println("Repeat Range $a")

倒序

for (a in 3 downTo 0)
  println("Repeat Reverse-Range $a")

指定步长

for (a in 0..5 step 2)
  println("Repeat Range with Step $a")

Repeat

在 Kotlin 中还可以通过 repeat 操作来实现重复指定次数的操作。

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语句相似,Scala 与 Kotlin 的for 语句相似
  • Groovy 不支持 do-while 语句
  • 除了 Java 之外,其它语言都支持基于 Range 的增强型 for 循环
  • Scala 的 for 循环功能最强大
  • 除了 Scala 之外,其它语言都支持 breakcontinue,Scala 则必须使用 Breaks 工具类

文章源码见 https://github.com/SidneyXu/JGSK 仓库的 _12_loop 小节

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,119评论 9 118
  • 循环简介 循环可以用于让一个程序重复地执行语句。 循环是用来控制语句块重复执行的一种结构。 循环的概念是程序设计的...
    Vinfai阅读 1,126评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,504评论 18 399
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊阅读 18,268评论 0 85
  • 一直想自己写些东西可是碍于自己可怜的智商和文采,所以从未付诸实施!今天,就把这里当做自己说心里话我记录心情的好地方吧
    依佳阅读 196评论 0 0