1 条件表达式
这里需要注意x的类型通过定义,scala系统推断为Int类型不能进行修改
scala中有Any类型
scala中的Unit类型(像java中void类型)
scala语句块,整个语句块中最后一个表达式返回为变量赋值
2 输入和输出
输出函数:
print, println, printf
输入函数:
var line=readLine()
var x=readInt()
3 循环
while循环
for循环
遍历字符串循环:
val s="hello"
for(i<-s)println(i) for(j<-0 to s.length-1)println(s(j))
注意:
scala中没有break和continue语句
可以导入Breaks中的break
import scala.util.control.Breaks._ for (i<-1 until 3){ for(j<-1 until 5){ if(i%3==0){ break } println(i) } }
4 高级for循环和推导
for循环中提供多个生成器,使用分号分割
for(i<-1 to 3;j<-4 to 5)printf("i:%d,j:%d\n",i,j)
每次循环带有守卫,使用if语句
for(i<-1 to 5;j<-2 to 4 if i!=j)printf("i:%d,j:%d\n",i,j)
在循环表达式中可以引入多个变量,并在循环中使用该变量
for(i<-1 to 5;x=i+1;j<-x to 4)printf("i:%d,j:%d\n",i,j)
for推导式:
循环体以yield开始,循环构造出一个集合,yield后面的表达式生成了集合中的值
val x=for(i<-1 to 5) yield i
print(x)//Vector(1, 2, 3, 4, 5)
如果yield中使用for的第一个表达式的类型是字符串,则最终返回字符串本身
val y=for(x<-"ok"; i<-1 to 3) yield (x+i).toChar
print(y)//pqrlmn
但是yield中使用for的第二个表达式是字符串类型,则返回集合
val x=for(i<-1 to 3;j<-"ok")yield (j+i).toChar
println(x)//Vector(p, l, q, m, r, n)
5 函数
scala中可以定义函数,其中参数类型必须给出,如果函数不是递归函数,无需给出返回类型;
函数通过=符号后的表达式 自动推导返回类型
def one(x:Int,y:Int)=x+y
def func(x:Int):Int=if(x==1||x==0) 1 else x*func(x-1)
5.1 默认参数和带名参数
函数参数定义中可以使用默认值
def func2(x:String="<",y:Int=8)=x+y
调用
func2(y=66)
func2()
func2("<<")
但是
func2(6)这个调用违反参数的声明顺序
5.2 变长参数
在参数声明后添加*,表示可变长参数;函数得到一个seq类型的参数
x.tail得到除了第一个元素外的其他所有元素
def sum(x:Int*)={
println(x.tail)
var s=0;for(i<-x)s+=i;s
}
调用
val y=sum(1,2,3)
_*将1 to 5当做序列处理
val y2=sum(1 to 5:_*)
6 过程
当函数体前没有=符号,返回值类型自动变成Unit, 这种成为过程
def func(){
printf("ok")
}
或
def func():Unit={
printf("ok")
}
7 异常
使用throw抛出异常
def func(x:Int)={
if(x>0)
scala.math.sqrt(x)
else
throw new IllegalArgumentException("参数不能负数")
}
调用时使用try..catch处理异常
使用_代表异常变量;定义异常变量ex可以打印异常信息
try{
func(-9)
}catch{
case _:IOException=>print(-9)
case ex:IllegalArgumentException=>ex.printStackTrace()
}finally{
print("over")
}