scala

scala编程之控制内建结构

2017-02-21  本文已影响6人  雨果等夏天

一 scala的内建控制特点

  1. 只有if、while、for、try、match和函数调用。
  2. scala从语法层面支持函数字面量导致scala内建控制结构少。
  3. 几乎所有的scala内奸控制对象都会产生值(while等除外),这样有助于缩短代码(不在需要临时变量保存控制结构中的计算结果)。

二 scala 内建控制结构之if

//  if 方式1:
var filename_1="default.txt"
if(!args.isEmpty)
  filename_1=args(0)

// if 方式2: 优化上面的代码
//  1:代码易于阅读和重构。
//  2:主要的优点:使用了val而不是var。
//    2.1 val体现了函数式编程的风格,并且具有与java的final变量类似的效果。
//    2.2 能够更好地支持等效理论(equalational reasoning).在表达式没有副作用的情况下,引入的变量等效于计算它的表达式
val filename=
  if(!args.isEmpty) args(0)
  else "default.txt"

三 scala内建控制之while与dowhile

  1. 两者与java的一样。
  2. while与do-while 之所以被称为“循环”,而不是表达式,是因为他们不能产生有意义的结果,结果类型为Unit “()”。

`

//  while 循环
 def fun2(x: Int, y: Int): Unit ={
var a = x
var b = y
while (a != 0 ) {
  val tmp = a
  a =  b % a
  b = tmp
}
b
println("b=" + b)

}`

 // if 方式2: 优化上面的代码
//  1:代码易于阅读和重构。
//  2:主要的优点:使用了val而不是var。
//    2.1 val体现了函数式编程的风格,并且具有与java的final变量类似的效果。
//    2.2 能够更好地支持等效理论(equalational reasoning).在表达式没有副作用的情况下,引入的变量等效于计算它的表达式
val filename=
  if(!args.isEmpty) args(0)
  else "default.txt"
  1. 尽量对while的使用进行质疑,如同质疑var的使用一样。实际中while循环通常不是更新var就是执行IO。尽量用别的方式实现同样的功能。

四 Scala编程之for表达式

//  for表达式:
//1  for 表达式 之枚举集合类:能够做的最简单的事情就是把所有元素都枚举一遍。其他语法你需要借助一个变量,随时会面临超位溢出。
//2  for 表达式之 过滤
  def fun6(): Unit ={
    val fileHere = (new File(".//src")).listFiles()
//  通过发生器(generator) 遍历每一个元素。
    for (file <- fileHere
         if file.getName.endsWith("Scala_6.scala")
    ) println(fileLines(file).length)
}

//3   for 表达式之Range类型。
  def fun7(): Unit ={
//  to 包含Range的上边界,until 不包括Range的上边界
    for (i <- 1 until 4)
      println(i)
  }

  //3  for 表达式之 嵌套枚举
  val fileHere = (new File(".")).listFiles()
//  def fun8(pattern:String)=(
//      for(
//        file <- fileHere
//        if file.getName.endsWith(".scala")
//        line <- fileLines(file)
//      )
//  )

//  4 for表达式之 制造新的集合;
//  格式:for {字句} yield (循环)
  def fun8(): Unit ={
    val fileHere = (new File(".//src")).listFiles()
    val forLineLengths = for {
      file <- fileHere
      if file.getName.endsWith(".scala")
      line <-  fileLines(file)
      trimmed = line.trim
      if trimmed.matches(".*for.*")
    } yield  trimmed.length
  }
  def fileLines(file:File)= scala.io.Source.fromFile(file).getLines.toList

五 Scala编程之 try-finally

//  scala 编程之try-finally
//  1:java的try-finally 不产生值,scala的行为会产生值。
  def fun9(): Unit ={
    try {
      val f = new FileReader("input.txt")
//      使用并关闭流文件
    } catch {
      case ex: FileNotFoundException => print("文件没有发现") // 处理丢失的文件
      case ex: IOException => // 处理其他的IO异常
    }finally{
//      文件、套接字、数据库链接
    }
  }

六 Scala编程之match#

1:详见书籍

七 Scala编程之 不在使用break和continue#

1:用if与while代替,详见书籍

八 Scala编程之变量范围

1:scala中内部范围与外部范围可以定义相同名的变量,在java中实不允许的。scala中内部的同名变量会遮蔽外部的同名变量。
上一篇 下一篇

猜你喜欢

热点阅读