美文网首页scala我爱编程
第二章:控制结构和函数

第二章:控制结构和函数

作者: Frank_8942 | 来源:发表于2018-04-15 21:21 被阅读17次

    条件表达式

    语法结构:   if (判断条件) {逻辑语句} else {逻辑语句}

    在scala中, if/else 表达式有值, 本质上就是块表达式是有值的; 

    val a: Any =if (0 ==0)"a" else 1

    =>所有数据类型的超类为 Any 类型

    val b: Int =if (0 ==0)1 else 2

    val c: Unit =if (0 ==0)1

    =>为了解决没有else的if语句, 在scala中引入 Unit 类型,写作 () ;不带else的 if 语句等同于: if (0=0) 1 else ()

    =>() 表示 无用值 的占位符, 就是 "无值" 的值;

    块表达式和赋值

    在scala 中, { } 块包含一系列表达式, 其结果也是一个表达式; 块中最后一个表达式的值就是块的值;

    val d = { val e =3 }

    =>在scala中, val e=3 这个赋值动作本身是没有值的, 或者说它们的值是Unit类型, 所以 d 的值为()

    循环

    scala拥有与java相同的 while和do 循环,但是for 循环做了改变;

    for( i <- 集合变量或表达式 ) { }

    =>scala 并没有提供break 或 continue 语句来退出循环,可以使用 boolean类型的控制变量, 以及拥有跳出循环的 return 来完成 break和continue 的功能;

    =>for循环可以提供多个循环变量: for ( i <- 1 to 3; j <- 1 to 5 ){ };

    =>for循环可以提供守卫: for ( i <- 1 to 3 if i != 2 ) { }

    =>yield 关键字: 在循环体中加上yield关键字,循坏会创建一个集合,此集合的类型会根据要遍历的集合的类型保持一致,每次迭代生成一个值放入集合;

    函数

    个人认为,scala中函数和方法的区别就在于 是否是基于对象的;函数可以独立与对象单独存在,并且函数还可分为匿名函数和普通函数,都可以作为变量进行传值; 而方法就必须依附与对象才能进行使用;

    def声明函数的数据类型: 

    def  fun_def ( i:String ):String = { "this is def "}

    fun_def :  (i:String)String

     匿名函数的数据类型:

    val  no_name = (i:String) => { "this is no name" }

    no_name : String => String = <function1>

    =>理论上编译器可以通过=右侧的表达式的类型推断出返回值类型,可以不写,但一定要写上=符号; 如果不写=符号,系统会认为是过程函数, 默认加上的是 :Unit= 空值标记,类似void;

    =>scala中有默认参数, def  a ( i:String, j:String="test"):String={ i+j }

    => lazy val name = xxx   懒值并不是非没有额外开销,我们每次访问懒值时,都会一个方法被调用,而这个方法将会以线程安全的方式检查该值是否被初始化;

    相关文章

      网友评论

        本文标题:第二章:控制结构和函数

        本文链接:https://www.haomeiwen.com/subject/stuphftx.html