条件表达式
语法结构: 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 懒值并不是非没有额外开销,我们每次访问懒值时,都会一个方法被调用,而这个方法将会以线程安全的方式检查该值是否被初始化;
网友评论