|
和java一样,有while,do while,for三种循环:
def main(args: Array[String]): Unit = {
var len = args.length;
var i = 0;
while(i < len) {
println(args(i))
i += 1
}
我在IDEA工具上设置了命令行参数 cn en us jp,程序显示如下:
cn
en
us
jp
如果用for来写循环,在java中,上例应该:
for(int i = 0; i<len; i++).....
但在scala中,for循环不能这么写,scala中也没有i++这种运算符,在scala中for循环应该:
for(arg <- args){
println(arg)
}
scala中在for循环的时候,还可以使用过滤条件:
for(arg <- args if(!arg.equals("jp"))){
println(arg)
}
则打印时不会出现jp。
for循环还可以结合yield,将循环体中的返回值作为变量,也就是说在循环中每次返回的值都会放入yield所指定的变量中:
var res = for(arg <- args if(!arg.equals("jp")))yield arg //注意各种颜色标识
println(res.length)
for(r <- res) {
println(r)
}
显示如下:
3
cn
en
us
其实在scala中循环应该以函数式编程方式使用才最方便,因为scala是函数式编程语言,所谓函数式编程,是指函数是本语言中的第一优先级对象,就象java中的类一样。
args.foreach(println)
如果不想打印"jp"则 args.foreach(s=>if(!s.equals("jp")){println(s)}) 这种写法目前有的人可能难以理解。
也会打印出四组参数出来。args.foreach(println)中foreach是一个函数,这个foreach函数有一个参数f,这个参数f也是一个函数,只不过这个f函数的作用是接收一个String,然后处理之后f函数无返回值,在scala中无返回值就是Unit类型,
回头再来看 args.foreach(s=>if(!s.equals("jp")){println(s)}) 其实对f参数采用了scala中的Lambda表达式形式,通过scala的推理,可以知道s是f函数的String参数,按f函数的作用,它需要返回Unit即无返回值,本句代码中判断不是jp则println,
而println函数的返回值是Unit类型的,所以语法正确。
关于函数式编程,此处只是一笔带过,重点是介绍scala的循环。
|
|