risc-v中文社区

 找回密码
 立即注册
查看: 1068|回复: 0

[原创] risc-v开发基础 Scala循环---(3)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-7-31 21:34:30 | 显示全部楼层 |阅读模式
和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的循环。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-27 14:33 , Processed in 0.028064 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表