Scala运算符及流程控制

Scala运算符及流程控制


文章目录

  • Scala运算符及流程控制
    • 写在前面
    • 运算符
      • 算数运算符
      • 关系运算符
      • 赋值运算符
      • 逻辑运算符
      • 位运算符
      • 运算符本质
    • 流程控制
      • 分支控制
        • 单分支
        • 双分支
        • 多分支
      • 循环控制
        • for循环
        • while循环
        • 循环中断
        • 嵌套循环

写在前面

  • 操作系统:Windows10
  • JDK版本:jdk1.8
  • Maven版本:Maven-3.5.4
  • Scala版本:Scala-2.12.11
  • IDE工具:IntelliJ IDEA 2019.2.3

scala运算符的使用和Java运算符的使用基本相同,只有个别细节上不同。

运算符

算数运算符

我们先定义变量 A 为 10,B 为 20,那么+、-、*、/四个算术运算符的结果如下图所示:

关系运算符

我们先定义变量 A 为 10,B 为 20,那么==、!=、>、<、>=、<=六个关系运算符的结果如下图所示:

赋值运算符

已知有变量 A,B,C,那么==、+=、-=、*=、/=、%=、<<=、&=、^=、^|=一共11个赋值运算符的结果如下图所示:

逻辑运算符

我们先定义变量 A 为 1,B 为 0,那么&&、||、!三个运算符的结果如下图所示:

位运算符

我们先定义变量 A = 60; 及 B = 13; 同时两个变量对应的二进制为:

复制代码
A = 0011 1100
B = 0000 1101

那么,各种使用位运算符号最终的运算结果如下图所示:

运算符本质

在Scala中其实是没有运算符的,所有运算符都是**方法**。

  • scala是完全面向对象的语言,所以数字其实也是对象

  • 当调用对象的方法时,点.可以省略

  • 如果函数参数只有一个,或者没有参数,()可以省略

举例如下所示:.+()表示方法

scala 复制代码
object ScalaOper {
    def main(args: Array[String]): Unit = {
        val i : Int = 10
        val j : Int = i.+(10)
        val k : Int = j +(20)
        val m : Int = k + 30
        println(m)
    }
}

流程控制

Scala程序代码和所有编程语言代码一样,都会有特定的执行流程顺序,默认情况下是顺序执行,上一条逻辑执行完成后才会执行下一条逻辑,执行期间也可以根据某些条件执行不同的分支逻辑代码。

分支控制

让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支

单分支

IF...ELSE 语句是通过一条或多条语句的执行结果(true或者false)来决定执行的代码块

scala 复制代码
if(布尔表达式) {
  // 如果布尔表达式为 true 则执行该语句块
}

如果布尔表达式为 true 则执行大括号内的语句块,否则跳过大括号内的语句块,执行大括号之后的语句块。

scala 复制代码
object ScalaBranch {
    def main(args: Array[String]): Unit = {
        val b = true
        if (b) {
           println("true")
  		  }
    }
}
双分支
复制代码
if(布尔表达式) {
  // 如果布尔表达式为 true 则执行该语句块
} else {
  // 如果布尔表达式为 false 则执行该语句块
}

如果布尔表达式为 true 则执行接着的大括号内的语句块,否则执行else后的大括号内的语句块。

scala 复制代码
object ScalaBranch {
    def main(args: Array[String]): Unit = {
        val b = true
        if (b) {
            println("true")
    } else {
        println("false")
    }
    }
}
多分支
复制代码
if(布尔表达式1) {
  // 如果布尔表达式1为 true,则执行该语句块
} else if ( 布尔表达式2 ) {
  // 如果布尔表达式2为 true,则执行该语句块
}...
} else {
  // 上面条件都不满足的场合,则执行该语句块
}

实现一个小功能:输入年龄,如果年龄小于18岁,则输出"童年"。如果年龄大于等于18且小于等于30,则输出"青年",如果年龄大于30小于等于50,则输出"中年",否则,输出"老年"。

scala 复制代码
object ScalaBranch {
    def main(args: Array[String]): Unit = {
        val age = 30
        if ( age < 18 ) {
            println("童年")
        } else if ( age <= 30 ) {
            println("青年")
        } else if ( age <= 50 ) {
            println("中年")
        } else {
            println("老年")
        }
    }
}

实际上,Scala中的表达式都是有返回值的,所以上面的小功能还有其他的实现方式

scala 复制代码
object ScalaBranch {
    def main(args: Array[String]): Unit = {
        val age = 30
        val result = if ( age < 18 ) {
            "童年"
        } else if ( age <= 30 ) {
            "青年"
        } else if ( age <= 50 ) {
            "中年"
        } else {
            "老年"
        }
        println(result)
   }
}

循环控制

有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了更为复杂执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组

Scala语言提供了以下几种循环类型

for循环
  • 基本语法

    for (循环变量 <- 数据集) {
    循环体
    }

这里的数据集可以是任意类型的数据集合,如字符串,集合,数组等,这里我们还没有讲到集合,数组语法,请大家不要着急,先能演示例子,后面咱们详细讲。

scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for (i <- Range(1,7)) { // 范围集合
            println("i = " + i)
        }
        for ( i <- 1 to 7) { // 包含5
            println("i = " + i)
        }
        for ( i <- 1 until 7) { // 不包含5
            println("i = " + i)
        }
    }
}
  • 循环守卫

循环时可以增加条件来决定是否继续循环体的执行,这里的判断条件我们称之为循环守卫

scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for (i <- Range(1,7) if i != 4) {
            println("i = " + i)
        }
    }
}
  • 循环步长

Scala的集合也可以设定循环的增长幅度,也就是所谓的步长step

scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for (i <- Range(1,7,2)) {
            println("i = " + i)
        }
        for (i <- 1 to 7 by 2) {
            println("i = " + i)
        }
    }
}
  • 循环嵌套
scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for (i <- Range(1,7); j <- Range(1,6)) {
            println("i = " + i + ",j = " + j)
        }
        for ( i <- Range(1,7) ) {
            for ( j <- Range(1,6)) {
                println("i = " + i + ",j = " + j)
            }
        }
    }
}

Note:请好好体会上面两种嵌套方式的区别。

  • 引入变量

引入j变量

scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for (i <- Range(1,7); j = i - 1) {
            println("j = " + j )
        }
    }
}
  • 循环返回值

Scala所有的表达式都是有返回值的。但是这里的返回值并不一定都是有值的哟。

如果希望for循环表达式的返回值有具体的值,需要使用关键字yield

scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        val result = for (i <- Range(1,7) ) yield {
            i * 2
        }
        println(result)
    }
}
while循环
  • 基本语法**

当循环条件表达式返回值为true时,执行循环体代码

复制代码
while( 循环条件表达式 ) {
  循环体
}

一种特殊的while循环就是,先执行循环体,再判断循环条件是否成立

复制代码
do {
  循环体
} while ( 循环条件表达式 )
  • while循环
scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        var i = 0
        while (i < 7) {
            println(i)
            i += 1
        }
    }
}
  • do...while循环
scala 复制代码
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        var i = 7
        do {
            println(i)
        } while (i < 7)
    }
}
循环中断

scala是完全面向对象的语言,所以无法使用break,continue关键字这样的方式来中断,或继续循环逻辑,而是采用了函数式编程的方式代替了循环语法中的break和continue(scala.util.control.Breaks.break)

scala 复制代码
object ScalaLoop {
  def main(args: Array[String]): Unit = {
    scala.util.control.Breaks.breakable {
      for (i <- 1 to 5) {
        if (i == 3) {
          scala.util.control.Breaks.break
        }
        println(i)
      }
    }
  }
}
嵌套循环

循环中有循环,就是嵌套循环。
全文结束!

相关推荐
Wang's Blog3 分钟前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff16 分钟前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
下一站春风里1 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
FinelyYang2 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能
天外飞雨道沧桑2 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl2 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
运维行者_2 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
用户3126874877202 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java
东华果汁哥2 小时前
【Spring AI 实战】从零开始调用大模型接口,构建 Java AI 应用
java·人工智能·spring
“AI国潮设计-小江”3 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc