一、条件表达式if

Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的。

object ScalaApp extends App {

  val x = "scala"
  val result = if (x.length == 5) "true" else "false"
  print(result)

}

在 Java 中,每行语句都需要使用 ; 表示结束,但是在 Scala 中并不需要。除非你在单行语句中写了多行代码。

二、块表达式

在 Scala 中,可以使用 {} 块包含一系列表达式,块中最后一个表达式的值就是块的值。

object ScalaApp extends App {

  val result = {
    val a = 1 + 1; val b = 2 + 2; a + b
  }
  print(result)
}

// 输出: 6

如果块中的最后一个表达式没有返回值,则块的返回值是 Unit 类型。

scala> val result ={ val a = 1 + 1; val b = 2 + 2 }
result: Unit = ()

三、循环表达式while

Scala 和大多数语言一样,支持 whiledo ... while 表达式。

object ScalaApp extends App {

  var n = 0

  while (n < 10) {
    n += 1
    println(n)
  }

  // 循环至少要执行一次
  do {
    println(n)
  } while (n > 10)
}

四、循环表达式for

for 循环的基本使用如下:

object ScalaApp extends App {

  // 1.基本使用  输出[1,9)
  for (n <- 1 until 10) {print(n)}

  // 2.使用多个表达式生成器  输出: 11 12 13 21 22 23 31 32 33
  for (i <- 1 to 3; j <- 1 to 3) print(f"${10 * i + j}%3d")

  // 3.使用带条件的表达式生成器  输出: 12 13 21 23 31 32
  for (i <- 1 to 3; j <- 1 to 3 if i != j) print(f"${10 * i + j}%3d")

}

除了基本使用外,还可以使用 yield 关键字从 for 循环中产生 Vector,这称为 for 推导式。

scala> for (i <- 1 to 10) yield i * 6
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(6, 12, 18, 24, 30, 36, 42, 48, 54, 60)

五、异常处理try

和 Java 中一样,支持 try...catch...finally 语句。

import java.io.{FileNotFoundException, FileReader}

object ScalaApp extends App {

  try {
    val reader = new FileReader("wordCount.txt")
  } catch {
    case ex: FileNotFoundException =>
      ex.printStackTrace()
      println("没有找到对应的文件!")
  } finally {
    println("finally 语句一定会被执行!")
  }
}

这里需要注意的是因为 finally 语句一定会被执行,所以不要在该语句中返回值,否则返回值会被作为整个 try 语句的返回值,如下:

scala> def g():Int = try return 1 finally  return  2
g: ()Int

// 方法 g() 总会返回 2
scala> g()
res3: Int = 2

六、条件选择表达式match

match 类似于 java 中的 switch 语句。

object ScalaApp extends App {

  val elements = Array("A", "B", "C", "D", "E")

  for (elem <- elements) {
    elem match {
      case "A" => println(10)
      case "B" => println(20)
      case "C" => println(30)
      case _ => println(50)
    }
  }
}

但是与 Java 中的 switch 有以下三点不同:

  • Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常量;
  • Scala 中每个分支语句后面不需要写 break,因为在 case 语句中 break 是隐含的,默认就有;
  • 在 Scala 中 match 语句是有返回值的,而 Java 中 switch 语句是没有返回值的。如下:
object ScalaApp extends App {

  val elements = Array("A", "B", "C", "D", "E")

  for (elem <- elements) {
    val score = elem match {
      case "A" => 10
      case "B" => 20
      case "C" => 30
      case _ => 50
    }
    print(elem + ":" + score + ";")
  }
}
// 输出: A:10;B:20;C:30;D:50;E:50;

七、没有break和continue

额外注意一下:Scala 中并不支持 Java 中的 break 和 continue 关键字。

八、输入与输出

在 Scala 中可以使用 print、println、printf 打印输出,这与 Java 中是一样的。如果需要从控制台中获取输入,则可以使用 StdIn 中定义的各种方法。

val name = StdIn.readLine("Your name: ")
print("Your age: ")
val age = StdIn.readInt()
println(s"Hello, ${name}! Next year, you will be ${age + 1}.")

参考资料

  1. Martin Odersky . Scala 编程 (第 3 版)[M] . 电子工业出版社 . 2018-1-1
  2. 凯.S.霍斯特曼 . 快学 Scala(第 2 版)[M] . 电子工业出版社 . 2017-7

更多大数据系列文章可以参见 GitHub 开源项目大数据入门指南

Scala 系列(三)—— 流程控制语句的更多相关文章

  1. java与.net比较学习系列(5) 流程控制语句

    java中流程控制语句主要分为以下几类,第一,条件语句,主要包括if语句和switch语句.第二,循环语句,主要包括while循环语句,for循环语句.第三,跳转语句,主要包括三种,break跳出语句 ...

  2. Sql Server系列:流程控制语句

    T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...

  3. 自学Java第三章——《流程控制语句结构》

    流程控制语句结构分为: 1.顺序结构:从上到下依次执行 2.分支结构:多个分支选择其中一个分支执行 3.循环结构:重复执行某些代码 3.1 顺序结构 执行过程:从上到下顺序执行 3.1.1 输出语句 ...

  4. awk系列:在awk中如何使用流程控制语句

    导读 当你回顾所有到目前为止我们已经覆盖的 awk 实例,从 awk 系列的开始,你会注意到各种实例的所有指令是顺序执行的,即一个接一个地执行.但在某些情况下,我们可能希望基于一些条件进行文本过滤操作 ...

  5. Java基础三(Scanner键盘输入、Random随机数、流程控制语句)

    1.引用类型变量的创建及使用2.流程控制语句之选择语句3.流程控制语句之循环语句4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类是属于 ...

  6. 固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

    一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符 ...

  7. Mysql高手系列 - 第18篇:mysql流程控制语句详解(高手进阶)

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第18篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...

  8. Java基础之路(三)下--流程控制语句

    上次我们说了流程控制语句中的if语句,那本次就来聊聊switch语句. if else语句可以用来描述"二叉路口",而switch可用于"多叉路口"的情况. s ...

  9. java 第三章 流程控制语句

    1.条件语句 (1)if 语句 ( 单一条件) if (表达式){ 执行语句块 } (2)执行流程 · if 语句 条件表达式可以是任何一种逻辑表达式   如果表达式值为true,则执行花括号的内容后 ...

  10. MYSQL进阶学习笔记三:MySQL流程控制语句!(视频序号:进阶_7-10)

    知识点四:MySQL流程控制语句(7-10) 选择语句: (IF ELSE ELSE IF CASE 分支)IFNULL函数 IF语法: 语法规则: IF search_condition THEN ...

随机推荐

  1. Zabbix实战-简易教程--中间件kafka监控

    一.环境准备 1.安装kafka Step 1: 下载代码 你可以登录Apache kafka 官方下载.http://kafka.apache.org/downloads.html备注:2.11-1 ...

  2. 如何优雅地执行dubbo"单测"

    很多小伙伴所在的公司是基于Dubbo来构建技术栈的,日常开发中必不可少要写dubbo单测(单元测试),如果单测数据依赖已有的外部dubbo服务,一般是mock数据,如果数据比较复杂,其实mock数据也 ...

  3. adb server version (31) doesn't match this client (41); killing...

    1.有时候用adb工具去连接安卓设备,或者模拟器的时候,会提示adb server version(31) doesn’t match this client(41)这样的提示.如图 提示的字面意思就 ...

  4. maven本地仓库已经有了所需的jar包,为什么还要去请求远程仓库

    问题 IDEA 中的maven 项目,一个jar包一直导入不进来,reimport 无效.从另一仓库把这个jar包拷贝到当前仓库,还是无效.mvn clean install -e U 发现加载这个j ...

  5. android ------ AndroidX的 Tablayout(com.google.android.material.tabs.TabLayout) 的使用

    前面呢,有写过TabLayout的博客,最近开发用到了AndroidX来解决前面的问题,不要工具类设置下划线的问题了,来总结一下 Android--------TabLayout实现新闻客户端顶部导航 ...

  6. iOS逆向(五)-ipa包重签名

    为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...

  7. java中HashSet对象内的元素的hashCode值不能变化

    因为不管是HashMap(或HashTable,还是HashSet),key值是以hashCode值存进去的,加入key值变了,将无法从集合内删除对象,导致内存溢出.

  8. 【转载】 TensorFlow tf.app&tf.app.flags用法介绍

    作 者:marsggbo 出 处:https://www.cnblogs.com/marsggbo版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本. ---------- ...

  9. Python 精选文章

    操作Excel,通过宏调用Pyhton(VBA调Python) 第一个django项    https://www.jianshu.com/p/45b07d8cd819

  10. elementUI vue this.$confirm 和el-dialog 弹出框 移动

    调试了好久, 还能凑合用, 请直接看DOME 示例,复制就能用: <!DOCTYPE html> <html lang="zh"> <head> ...