标签:
IV.控制结构
1.if/else
除基本用法外,if/else语句能用来赋值,进而代替?:
运算符。这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值。请看下面的代码。
def abs(x: Int) = if(x < 0) -x else x
2.与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()。
PS:scala中赋值语句也没有值。
3.用于迭代一个集合的for语句,格式为for(item <- collection)。一些collection举例:
0 to list.length - 1
0 until list.length
val list = List("Tom", "Jach", "Jimmy", "Abby")
嵌套for循环 直接分号隔开就行。
for(i <- 0 to 1; j <- 1 to 2; k <- 2 to 3) {
println("i = %d, j = %d, k = %d".format(i, j, k))
}
i % 2 == 0
,这意味着,仅有满足这个条件的i才会被循环执行。for{i <- 0 to 5
if i % 2 == 0
j <- 1 to 2} {
println("i = %d, j = %d".format(i, j))
}
//引入了变量lower,这与通常我们定义变量的方式相比,只是少了val。这个变量在for表达式中和循环体中都可以使用。
val list = List("Html", "XML", "JSON", "text", "md") for{ ext <- list lower = ext.toLowerCase if lower != "html"} { println("Accepted data format: " + lower) }
产生新的集合 for(claus) yield {body} 可以用来产生新的集合。
val result = for(i <- 1 to 3; j <- 2 to 4) yield { i + j } println(result)
4.match
"your selector" match { case "case 1" => //handle case 1 case "case 2" => //handle case 2 ... case _ => //handle the rest, like default in switch-case }
def passed_?(grade: Char) = {
grade match {
case ‘A‘ | ‘B‘ | ‘C‘ => true //case ‘A‘ | ‘B‘ | ‘C‘ => true
这正是其他语言中,switch-case贯穿执行的情况
case _ => false
}
}
5.异常
当碰到异常情况时,方法抛出一个异常,终止方法本身的执行,异常传递到其调用者,调用者可以处理该异常,也可以升级到它的调用者。运行系统会一直这样升级异常,直到有调用者能处理它。 如果一直没有处理,则终止整个程序。
//并不像Java代码那样,需要声明方法会抛出异常,这给程序员省去理论很多烦恼。
def divide(x: Int, y: Int): Int = { if (y == 0) throw new Exception("Divide by zero") else x / y }
finally字句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作。
6.中断循环:
import scala.util.control.Breaks._
val list = List("functions.md", "menu.json", "index.html", "data.xml") def hasHtml(input: List[String]): Boolean = { input match { case Nil => false case x :: sub => { if(x.endsWith("html")) return true else hasHtml(sub) } } } if(hasHtml(list)) println("There is at least one html file in the list") else println("There is no html file in the list")
V.类和对象
1.默认的访问修饰符是public。
Scala的类都有默认的基本构造函数,可以使用new来创建对象。
在类定义中,所有不属于方法和字段的语句,都属于主构造函数。
基本构造函数的参数就是类参数,类参数(或默认构造函数参数)默认的访问级别是对象私有,即private[this] val,若想要在类外部也能使用,只需显示注明为val或var,比如class ScoreCalculator(val athlete: String)
。
class ScoreCalculator private(val athlete: String)
class ScoreCalculator(athlete: String) { private var total, count = 0 println("This is in the primary constructor") def report(score: Int) { total += score count += 1 } def score = if (count == 0) 0 else total / count override def toString() = athlete + "‘s score is " + score } val sc = new ScoreCalculator("Yao") println("\nJust created an object, now you can use it.\n") sc.report(80) sc.report(90) println(sc)
class ScoreCalculator { var athlete = "" var degreeOfDifficulty = 0.0 def this(athlete: String) { this() //Call primary constructor this.athlete = athlete } def this(athlete: String, degreeOfDifficulty: Double) { this(athlete) //Call another auxiliary constructor this.degreeOfDifficulty = degreeOfDifficulty } override def toString = "Athlete: " + athlete + ", degree of difficulty: " + degreeOfDifficulty } val sc1 = new ScoreCalculator("Gao Min") sc1.degreeOfDifficulty = 3.7 println(sc1) val sc2 = new ScoreCalculator("Fu Mingxia", 3.5) println(sc2)
2.类的属性
name_= (parameters)
,名称,下划线和等号是一个整体,之间不能有空格。不是很懂,再研究吧。
3.单例对象:消除静态。单例对象可分为两种,不与某个类共享源文件和名称的,称为独立对象(Standalone Object),与此相反,与某个类共享名称的,称为伴生对象(Companion Object)。
Object(args..)。
4.独立对象可以包含main方法,并且可以用extends App表示(app特质)。
object MyApplication extends App { args.foreach(println) }
标签:
原文地址:http://www.cnblogs.com/aezero/p/4563489.html