1. package com.dtspark.scala.basics
  2.  
  3. /**
  4.  
  5. * Scala中的基本控制结构有顺序、条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结构类模式匹配;
  6.  
  7. * 在这里我们主要if、for、while等三种控制结构及其企业级最佳实践,并且在最后用Spark源码说明
  8.  
  9. *
  10.  
  11. */
  12.  
  13. object ControlStructures {
  14.  
  15. def main(args: Array[String]): Unit = {
  16.  
  17. println("Scala")
  18.  
  19. /**
  20.  
  21. * if条件表达式会更会if会面括号里面的boolean值来决定整个if表达式的值
  22.  
  23. *
  24.  
  25. * 1,Scala中的if条件表达式是有值的!!! 这个Java是不一样的!
  26.  
  27. * 2, if条件表达式中可以进行类型推倒,类型推到的一般过程就是更具变量的值的类型来推倒确定变量的类型,这在很多复杂算法的实现的时候可以让我们
  28.  
  29. * 省略掉变量的类型的书写,为复杂算法的实现提供了非常大的便利;
  30.  
  31. * 3,如果if后面没有else部分,默认的实现是if(....) ... else ()
  32.  
  33. * 下面的 例子节选自Spark的核心类SparkContext,在else部分虽然不返回有意义的结果,但是依旧没有省略else,而是使用了else { None}这种方式
  34.  
  35. * 其目的是为了确保if条件表达式的类型为处理逻辑需要的类型Option,而不是Any类型,为下一步的处理大家基础
  36.  
  37. * if (isEventLogEnabled) {Some(logger) } else { None}
  38.  
  39. * 4,if表达式中如果有多条语句可以使用{}包裹起来,但是这里就有一个问题了,{}中的多条语句,哪一条是计算结果呢,前面已经说明,是{}中的最后一条语句
  40.  
  41. * 5,补充说明,{...} 代表了一个语句块,语句块是有值的,值就是最后一条语句,请类型是最后一条语句值的类型
  42.  
  43. * 6, if表达式可以用在for循环等其它控制结构中用于限制结果
  44.  
  45. */
  46.  
  47. var age = 10
  48.  
  49. val result = if (age > 25) "Worker" else "Student" //此时因为"Worker" 和 "Student"都是字符串,所以result也是字符串类型
  50.  
  51. println(result)
  52.  
  53. val result2 = if (age > 18) "Adult" else 1 //此时因为if表达式中的else两侧的内容一个是字符串类型、另外一个是整数类型,所以result2的类型是两种的公共父类Any
  54.  
  55. val result3 = if (age > 18) "Adult" else ()
  56.  
  57. println(result3)
  58.  
  59. var x,y =0
  60.  
  61. val result4 = if(age < 18) {
  62.  
  63. x = x + 1;
  64.  
  65. y = y + 1;
  66.  
  67. x + y
  68.  
  69. } else 0
  70.  
  71. println(result4)
  72.  
  73. for(i <- 0 to 5 if i%2 ==0 ) {
  74.  
  75. println(i)
  76.  
  77. }
  78.  
  79. /**
  80.  
  81. * for循环是不断的循环一个集合,然后for循环后面的{...}代码块部分会根据for循环(...)里面提取的集合的item来作为{...}的输入进程流程控制
  82.  
  83. * 1,for循环中加入的if叫做条件守卫,用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)
  84.  
  85. * 2,最后再次强调一下,在for循环中能够提取出什么内容取决于后面的集合的类型!
  86.  
  87. * 3,想跳出for循环的话,除了加入if守卫以外,还可以使用return关键字
  88.  
  89. */
  90.  
  91. var flag = true
  92.  
  93. var sum = 0
  94.  
  95. for(i <- 0 to 6 if flag){
  96.  
  97. sum = sum + i
  98.  
  99. if(5 == i) flag = false
  100.  
  101. }
  102.  
  103. println("sum = " + sum)
  104.  
  105. /* sum = 0
  106.  
  107. for(i <- 0 to 6){
  108.  
  109. sum = sum + i
  110.  
  111. if(5 == i) return //return 返回的是方法级别的,这在实际开发中也非常常用
  112.  
  113. }*/
  114.  
  115. println("sum with return = " + sum)
  116.  
  117. for(item <- "Hello Spark".split(" ")) println(item)
  118.  
  119. /**
  120.  
  121. * while循环,也是循环集合来作为{...}的输入,进而完成流程的控制的,while循环在实际Server和Framework开发中至关重要,例如让一个
  122.  
  123. * 线程一直循环下去,一般都会使用while;
  124.  
  125. *
  126.  
  127. */
  128.  
  129. import scala.util.control.Breaks._
  130.  
  131. flag =true
  132.  
  133. breakable{
  134.  
  135. while(flag){
  136.  
  137. for(item <- "Spark"){
  138.  
  139. println(item)
  140.  
  141. if(item == 'r') {
  142.  
  143. flag = false
  144.  
  145. break
  146.  
  147. }
  148.  
  149. }
  150.  
  151. }
  152.  
  153. }
  154.  
  155. println("while finished!!!")
  156.  
  157. }
  158.  
  159. }

Scala入门之控制结构的更多相关文章

  1. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  2. Scala入门 【1】

    Scala入门 [1] 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 基础 val定义的为常量,var为变量 val name:Type = ***,变量名后加冒号 ...

  3. Scala入门到精通

    原文出自于: http://my.csdn.net/lovehuangjiaju 感谢! 也感谢,http://m.blog.csdn.net/article/details?id=52233484 ...

  4. Scala入门(1)Linux下Scala(2.12.1)安装

    Scala入门(1)Linux下Scala(2.12.1)安装 一.文件准备 1.1 文件名称 scala-2.12.1.tgz 1.2 下载地址 http://www.scala-lang.org/ ...

  5. scala 入门Eclipse环境搭建

    scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld IDE选择并下载: scala for eclipse 下载: http://scala-ide.org/downloa ...

  6. Scala 入门详解

    Scala 入门详解 基本语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递.类,对象,方法,实例变 ...

  7. idea创建Scala入门HelloWorld

    Scala开发环境的搭建 首先到Scala官网下载Scala网址为 https://www.scala-lang.org/download/ 找到下图所示位置:选择相对应的版本的Scala进行下载,这 ...

  8. IntelliJ中的Scala入门

    IntelliJ IDE中的Scala入门 创建项目 打开IntelliJ并单击File => New => Project 在左侧面板中,选择Scala.在右侧面板中,选择IDEA. 将 ...

  9. scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld

    scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld 学习了: http://blog.csdn.net/wangmuming/article/details/3407911 ...

随机推荐

  1. my_strcpy()

    char* my_strcpy(char* des, const char* src){ while(*des++=*src++); return des; }

  2. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  3. 举例讲解Linux系统下Python调用系统Shell的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:1. os 模块 ...

  4. linux mount 硬盘挂载和卸载

    Linux 挂载 [root@whp6 ~]# mount /dev/sdb5 /mnt/ [root@whp6 ~]# df -h Filesystem Size Used Avail Use% M ...

  5. C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define

    ilocker:关注 Android 安全(新手) QQ: 2597294287 #define ASPECT_RATIO 1.653 记号 ASPECT_RATIO 不会进入 symbol tabl ...

  6. using语法糖

    资源的分类 首先说一下资源的分类: 托管资源:由CLR管理分配和释放资源 非托管资源:不受CLR管理的对象,如 文件(StreamReader,BinaryReader,DataTable,各种Str ...

  7. LoadRunner 12.02 安装教程及中文语言包安装

    注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装过LoadRunner,则将其卸载. 安装路径不要带中文字符. LoadRunner 12已经不再支持xp系统,仅支持win7和win8系 ...

  8. AndroidStudio 混淆打包

    AndroidStudio中的项目可以用compile的形式引入github上的开 源项目,可以引用module,而不一定都要用libs文件夹中添加jar包的形式.在最终realease打包时,混淆的 ...

  9. 关于button和form提交的一些问题

    1.form 中type 为submit 和button的区别 submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理( ...

  10. maya 专家模式

    maya中按ctrl + 空格 可以在普通模式与专家模式之间切换,如图 普通模式 按ctrl+空格后进入专家模式 来自为知笔记(Wiz)