美文网首页
Java & Groovy & Scala & Kotlin -

Java & Groovy & Scala & Kotlin -

作者: bookislife | 来源:发表于2017-07-02 19:51 被阅读0次

    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 小节

    相关文章

      网友评论

          本文标题:Java & Groovy & Scala & Kotlin -

          本文链接:https://www.haomeiwen.com/subject/cglocxtx.html