2.1 条件表达式
2.1.1 Scala中if/else语法结构和java一样,不同点在于此if表达式有值:
val s=if (x>0) 1 else -1 //s的值要么是1,要么是-1,取决于X的范围
在Scala中,每个表达式都有一个类型,如下是混合表达式类型:
if(x>0) "positive" else -1 //此表达式是两个分支类型的公共超类型,一个是java.lang.String,一个是int,他们公共超类是Any
如何else部分缺失了,比如:
if(x>0) 1 //
每个表达式都有值,这个问题的解决方案是引入一个Unit类(类似于JAVA中的void),写作(), 此语句等同于if(x>0) 1 else ()
注意点:REPL中一般只读取一行数据,用花括号可以解决此问题,或者可以使用粘贴模式。键入:paste 把代码粘贴进去,然
后按下Ctrl+D即可
2.2 语句终止
2.2.1 单行中写多行需要用分号,一般不会使用分号
2.2.2 如果语句较长,需要分两行写,一般使用{}
if(n>0) {
r=r*n
n-=1
}
2.3 块表达式
2.3.1块表达式用于存放多个动作,在scala中使用{}块包含一系列表达式,其结果是最后一个表达式,块中最后一个表达式的值就是块的值。
2.3.2 一个赋值语句块{r=r*n;n-=1},因为赋值语句是没有值的也及是Unit类型,所有此代码块也是Unit类型
2.4输入和输出
2.4,常见输出print和println,另外还与一个printf("Hello,%s! you are %d years old.\n","Fred",24)
2.4.2常见输入操作readLine从控制台读取一行输入。如果对其数字,Boolean或者字符,可以用readInt、readChar等,readLine带一个参数作为输入提示符:
val name=readLine("you name:")
2.5循环
2.5.1 while循环和jave相似
2.5.2 Scala的for与java有差异,for(i<-1 to n) r=r*i //其中:1 to n是使用RichInt类的to方法,返回1到n的数字
2.5.3 语法结构:
for(i <- 表达式)
让变量ib遍历<- 右边表达式的所有值,遍历字符串和数值时,你通常需要使用0到n-1的区间,这时你可以才用until方法而 不是to方法,util方法返回一个并不包含上限的区间。比如:
val s="hello"
val sum=0
for (i < - 0 until s.length)
sum +=s(i)
我们也可以直接遍历对应的字符序列
var sum=0
for(i<-"hello")
sum +=i
注意:Scala不支持break和continul语句退出循环,如果要break可以采用如下方式:
1.使用Boolean类型的控制变量
2.使用嵌套函数----你可以从函数中return
3..使用Breaks对象的break方法。
import scala.util.contorl.Breaks._
breakable {
for(....) {
if(......) break;
......
}
}
2.6高级for循环和for推导式
2.6.1你可以变量<-表达式的形式提供多个生产器,用逗号将他们隔开。例如
for(i <- 1 to 3;j < - 1 to 3) print((10*i+j)+" ") //打印 11 12 13 21 22 23 等
每个生成器都可以带一个守卫,已if开头的Boolean表达式:
for (i <- 1 to 3; j< - 1 to 3 if i !=j) print((10*i+j)+" ") //注意在if 之前没有分号
你可以使用任意多的定义,引入可以在循环中使用的变量:
for(i < - 1 to 3; from=4-i;j<- from to 3) print((10*i+j)+" ") //将打印 13 22 23 31
如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值:
for(i <- 1 to 10) yield i %3 //生成:Vector(1,2,0,.....)
2.7 函数
方法对对象进行操作,函数不是,函数定义如下:
def abs(x:Double) = if (x>=0) x else -x
必须给出所有参数的类型,不过,只要函数不是递归的,就不需要指定返回值类型。
对应递归函数必须指定返回值类型:
def fac(n:Int) :Int=if(n<=0) 1 else n*fac(n-1)
2.8 默认函数和带名函数
默认函数就是可以为函数的参数提供默认值,也可以传入提供的值
例如:def decorate(str:String ,left:String="[", right:String="]")=left+str+right
调用时可以用decorate("hello") 得到[hello], 也可以用decorate("hello","<",">") 得到<hello>
2.9变长函数
def sum( args:Int*)={
var results=0
for( arg<-args) results+=arg
results }
调用val s= sum(1,4,8,6) 也可以使用val s=sum(1 to 9:_*)
2.10无返回值函数
def box(x:String) :Unit = { 相应语句 }
2.11懒值
当val被生命为lazy时,它的初始化将被推迟,知道我们首次对它取值
lazy val words=scala.io.Source.fromFile("/usr/words").mkString.
2.12异常
try { process(new URL("http:www.baidu.com")) }
catch {
case _:MalformedURLException=> println("Bad URL"+url)
case ex:IOExcept => ex.printStackTrace()
}
finally { }