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. Spring,hibernate,struts的面试笔试题及答案

    Hibernate工作原理及为什么要用?  原理:  1.读取并解析配置文件  2.读取并解析映射信息,创建SessionFactory  3.打开Sesssion  4.创建事务Transation ...

  2. Spring 整体架构

    1. Core Container:核心容器(core.Beans.Context.Expression Language   Core.Beans框架基础构成,提供IOC.依赖注入特性.BeanFa ...

  3. 简析一下SQL Server里面Fast_Forword 和 SRROLL 的区别

    这次简单说说游标的分类. 先看看通常游标的语法 DECLARE cursor_name CURSOR [ LOCAL :局部游标,仅在当前会话有效 | GLOBAL : 全局游标,全局有效,可以 ] ...

  4. 【mysql】关于乐观锁

    一.乐观锁介绍 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检,乐观锁适用于 ...

  5. 关于 redis、memcache mongoDB 的对比

    from:http://yang.u85.us/memcache_redis_mongodb.pdf 从以下几个维度,对 redis.memcache.mongoDB 做了对比.1.性能都比较高,性能 ...

  6. iOS TabbarController 设置底部Toolbar图片和文字颜色选中样式

    提取公共方法: -(void)createChildVcWithVc:(UIViewController *)vc Title:(NSString *)title image:(NSString *) ...

  7. linux基础-第七单元 用户、群组及权限的深入讨论

    怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...

  8. SmartPointer Smar指针

    #include<iostream> using namespace std; // private class for use by HasPtr only class U_Ptr { ...

  9. C++浅析——虚函数的动态和静态绑定

    源自一道面试题,觉得很有意思 class CBase { public: virtual void PrintData(int nData = 111); }; void CBase::PrintDa ...

  10. java变量的初始化

    public class Init { private int age;//非静态初始化语句<3> private static String name; //静态初始化语句,先初始化静态 ...