经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Scala » 查看文章
Scala的控制结构和函数
来源:cnblogs  作者:codegeekgao  时间:2018/9/25 20:22:24  对本文有异议

控制结构和函数

先看以下简单的一个条件表达式的demo

  1. object TestConditional {
  2. def main(args: Array[String]): Unit = {
  3. // scala的if判断表达式
  4. var x = 1
  5. if (x > 0) x = 10 else x = 20
  6. println(x)
  7. }
  8. }

Scala的if/else语法结构与java一样,如以上代码一样,需要注意的是当else部分缺失了比如:if(x>0) 1,这个if语句没有输出值,但是在Scala中,每个表达式都应该有值,这个问题可以引入一个Unit类,写做()。不带else的这个if语句等同于 if (x>0) 1 else () Scala中没有switch语句,只需if即可解决所有。

  • 语句终止
  1. javaC++中,每一个语句都以分号结束,而在Scala中和JavaScript类似--行尾的位置不需要分号,因为Scala编译器能够从上下文明确判断出是语句的终止,但是若要在单行中写下多个语句,需要用分号隔开,例如下面的表达式需要分号隔开
  2. if (n > 0) {r = r * n; n-=1}
  3. 若是在写较长的语句,需要两行来写,需要告诉编译器不是语句结尾,例子如下:
  4. x = y + (v - m) * d + // +告诉编译器不是结尾
  5. 0.5 * c - v * t
  • 块表达式和赋值
  1. java中,块语句是一个包含与{}中的语句序列,在Scala中{}包含一系列表达式,在Scala中,赋值动作本身没有值,它们是Unit类型,相当于java中的void,而这个类型只有一个值,写做()
  2. {r = r * n; n-=1}
  • 输入和输出
  1. 打印一个值可以使用print或者println函数,
  2. 例如: println("x="+"10"),另外还有一个带有C风格格式化的字符串printf函数例如:
  3. printf("hello, %S! welcome to Scala world.\n","michael")
  4. 也可以使用readLine函数从控制台读取一行输入,读取数字,Boolean或者是字符,可以永readIntreadDoublereadBytereadShortreadLongreadFloatreadBoolean或者readChar
  5. // 使用readLine
  6. val name=readLine("your name:")
  7. print("your age")
  8. val age = readInt()
  9. printf("hello,%s! you have %d year work experience",name,age)
  • 循环

Scala中没有与for(初始化变量值;变量布尔表达式;变量更新),Scala中有两个选择:一个是使用while循环,而是使用以下for语句
for (i<- 表达式)让变量i遍历<-右边的表达式的所有值,对于Scala集合比如Range而言,会取到集合中的每个值

  1. Scala中没有提供break或者continue语句退出循环,一般可以有以下三种方法跳出循环:
  2. 1. 使用Boolean型的控制变量
  3. 2. 使用嵌套函数---使用return
  4. 3. 使用breaks对象中的break方法
  5. import scala.util.control.Breaks._
  6. breakable {
  7. for(...) {
  8. // 退出循环
  9. if(...) break;
  10. }
  11. }
  • for循环推导式

Scala中的for循环比java要丰富的多,下面介绍其高级特性

  1. // 多个生成器
  2. for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
  3. println()
  4. // 守卫生成器,if前没有分号
  5. for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
  6. // 可以定义变量,在循环中引入
  7. println()
  8. for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
  9. for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scalafor循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推。
  10. scala> for (i <- 1 to 5) yield i
  11. res10: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)
  • 函数

Scala中定义函数需要定义函数的名称、参数和函数体

  1. def abs (x: Double) = if (x >= 0) x else -x
  2. 必须给出所有参数的类型,只要不是递归就不需指定返回类型。Scala会自动通过=符号右侧的表达式的类型推断出返回类型
  3. // 递归函数,必须指定返回类型
  4. def fac(n : Int) Int = if (n<=0) 1 else n* fac(n -1)
  • 默认参数和带名参数
  1. /**
  2. * 我们在调用某些函数无需显示给出所有的参数值,可以初始化给出默认值
  3. */
  4. def haha(str:String,left:String="[",right:String="]") = left + str +right
  • 可变参数
  1. // 传入的参数是单个参数
  2. def sum(args : Int*):Int = {
  3. var result = 0
  4. for (arg <- args) result += arg
  5. // 返回result
  6. result
  7. }
  8. // 计算1+2的值
  9. val s1 = sum(1, 2)
  10. // 用法是错误的,因为1 to 3 是一个整数区间不是单个整数
  11. val s3 = sum (1 to 3)
  12. // 计算1+2+3的值(解决区间问题)
  13. val s2 = sum(1 to 3: _*)
  • 异常处理
  1. Scala异常的工作机制和javaC++一样,当你抛出异常时:
  2. throw new IllegalArgumentException("description for exception")
  3. java一样,抛出的对象必须是java.lang.Throwable的子类,不过没有编译时候的检查异常
  4. try {
  5. process(new URL("http:wwww.baidu.com"))
  6. } catch {
  7. // 自定义异常描述
  8. case _:URLException => println("bad url")
  9. // 使用默认异常信息
  10. case ex: IOException => ex.printStackTrace()
  11. }
  12. 使用try finally语句:
  13. var in = new URL("http:www.baidu.com").openStream()
  14. try {
  15. process(in)
  16. } finally {
  17. in.close()
  18. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号