package com.dtspark.scala.basics

 /**

  * Scala中的基本控制结构有顺序、条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结构类模式匹配;

  * 在这里我们主要if、for、while等三种控制结构及其企业级最佳实践,并且在最后用Spark源码说明

  *

  */

 object ControlStructures {

   def main(args: Array[String]): Unit = {

     println("Scala")

     /**

      * if条件表达式会更会if会面括号里面的boolean值来决定整个if表达式的值

      *

      * 1,Scala中的if条件表达式是有值的!!! 这个Java是不一样的!

      * 2,  if条件表达式中可以进行类型推倒,类型推到的一般过程就是更具变量的值的类型来推倒确定变量的类型,这在很多复杂算法的实现的时候可以让我们

      *      省略掉变量的类型的书写,为复杂算法的实现提供了非常大的便利;

      * 3,如果if后面没有else部分,默认的实现是if(....) ... else ()

      *  下面的 例子节选自Spark的核心类SparkContext,在else部分虽然不返回有意义的结果,但是依旧没有省略else,而是使用了else { None}这种方式

      *  其目的是为了确保if条件表达式的类型为处理逻辑需要的类型Option,而不是Any类型,为下一步的处理大家基础

      *  if (isEventLogEnabled) {Some(logger) } else { None}

      * 4,if表达式中如果有多条语句可以使用{}包裹起来,但是这里就有一个问题了,{}中的多条语句,哪一条是计算结果呢,前面已经说明,是{}中的最后一条语句

      * 5,补充说明,{...} 代表了一个语句块,语句块是有值的,值就是最后一条语句,请类型是最后一条语句值的类型

      * 6, if表达式可以用在for循环等其它控制结构中用于限制结果

      */

     var age = 10

     val result = if (age > 25) "Worker" else "Student"  //此时因为"Worker" 和 "Student"都是字符串,所以result也是字符串类型

     println(result)

     val result2 = if (age > 18) "Adult" else 1 //此时因为if表达式中的else两侧的内容一个是字符串类型、另外一个是整数类型,所以result2的类型是两种的公共父类Any

     val result3 = if (age > 18) "Adult" else ()

     println(result3)

     var x,y =0

     val result4  = if(age < 18) {

       x = x + 1;

       y = y + 1;

       x + y

     } else 0

     println(result4)

     for(i <- 0 to 5 if i%2 ==0 ) {

       println(i)

     }

     /**

      * for循环是不断的循环一个集合,然后for循环后面的{...}代码块部分会根据for循环(...)里面提取的集合的item来作为{...}的输入进程流程控制

      * 1,for循环中加入的if叫做条件守卫,用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)

      * 2,最后再次强调一下,在for循环中能够提取出什么内容取决于后面的集合的类型!

      * 3,想跳出for循环的话,除了加入if守卫以外,还可以使用return关键字

      */

     var flag = true

     var sum = 0

     for(i <- 0 to 6 if flag){

       sum = sum + i

       if(5 == i) flag = false

     }

     println("sum = " + sum)

    /* sum = 0

     for(i <- 0 to 6){

       sum = sum + i

       if(5 == i) return //return 返回的是方法级别的,这在实际开发中也非常常用

     }*/

     println("sum with return = " + sum)

     for(item <- "Hello Spark".split(" ")) println(item)

     /**

      * while循环,也是循环集合来作为{...}的输入,进而完成流程的控制的,while循环在实际Server和Framework开发中至关重要,例如让一个

      * 线程一直循环下去,一般都会使用while;

      *

      */

     import scala.util.control.Breaks._

     flag =true

     breakable{

        while(flag){

       for(item <- "Spark"){

         println(item)

         if(item == 'r') {

           flag = false

           break

         }

       }

     }

     }

     println("while finished!!!")

   }

 }

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. 简单看看ThreadPool的源码以及从中看出线程间传值的另一种方法

    这几天太忙没时间写博客,今天回家就简单的看了下ThreadPool的源码,发现有一个好玩的东西,叫做”执行上下文“,拽名叫做:”ExecutionContext“. 一:ThreadPool的大概流程 ...

  2. hw 要的是螺丝钉

    日前突然接到华为HR的电话,叫我去面试。本来我的工作和工资收入等各方面在本地也还算可以,没有想要跳槽。但是本着去看看有没有更好机会的想法就去了。  9:30到了现场后,在那里等了很久,一个考官上来问了 ...

  3. WD硬盘型号信息

    买硬盘的时候有时候分不清 既然找到了就发上来吧

  4. Fitbit Flex 智能手环佩戴心得 主要说说过敏

    参杂一篇杂文. 也是因为体重飙升,所以去年下半年的时候入手了一个Fitbit flex. 当时相比Jawbone up,nfc和ble的特性,以及防水性还是更吸引我一点.所以就入手了. 佩带了如此长的 ...

  5. 修改TFS客户端的工作区类型

    TFS系统存在两种工作区类型:"​本地"和"服务器".默认情况下,用户使用本地工作区实现代码管理. 但是在用户端代码文件特别多(超过10万个文件)时,由于每次启 ...

  6. 使用ajaxfileupload.js上传文件

    一直以来上传文件都是使用form表单上传文件,也看到过有人使用js上传文件,不过看起来蛮简单的也就没有怎么去理会.今天突然要使用这种方式上传文件,期间还遇到点问题.因此就记录下来,方便以后遇到这样的问 ...

  7. NOIP2002矩形覆盖[几何DFS]

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  8. Serializable

    import java.io.*;    public class  Box implements Serializable   {       private int width;       pr ...

  9. AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13

    13:将字符串中的小写字母转换成大写字母 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个字符串,将其中所有的小写字母转换成大写字母. 输入 输入一行,包含一个字符串(长度不 ...

  10. VS 代码Diff 之Beyone Compare

    前提条件 机器已安装 beyone compared软件和 visual svn for vs 插件. 在VS中集成SVN,我推荐使用 visual svn扩展. visual svn 官网:http ...