不帶命令行參數的簡化main方法:
object app1 extends Application {
println("hello world")
}
Scala的import可以只在局部作用域內生效;
可以格式 “import javax.swing.{JFrame=>jf}”來聲明類型的別名。
jf.show()
l import javax.swing._
l import java.util.{List, Map}
l import java.util._, java.io._
Scala 缺省導入以下包:
l java.lang.*
l scala.*
l scala.Predef
for .. yield
把每次循環的結果“移”進1個集合(類型和循環內的1致)
for {子句} yield {循環體}
正確:
for (e<-List(1,2,3)) yield (e*e) // List(1,4,9)
毛病:
for (e<-List(1,2,3)) { yield e*e } // 語法毛病,yield不能在任何括號內
reduceLeft:
reduceLeft 方法首先利用于前兩個元素,然后再利用于第1次利用的結果和接下去的1個元素,等等,直至全部列表。例如
計算階乘:
def fac(n: Int) = 1 to n reduceLeft(_*_)
fac(5) // 5*4*3*2 = 120
相當于:
((((1*2)*3)*4)*5)
計算sum:
List(2,4,6).reduceLeft(_+_) // 12
相當于:
((2+4)+6)
取max:
List(1,4,9,6,7).reduceLeft( (x,y)=> if (x>y) x else y ) // 9
或簡化為:
List(1,4,9,6,7).reduceLeft(_ max _) // 9
相當于:
((((1 max 4) max 9) max 6) max 7)
Scala中沒有break和continue語法!需要break得加輔助boolean變量,或用庫(continue沒有).
Scala沒有操作符,更談不上操作符重載;+-/*都是方法名,如1+2實際上是(1).+(2)
階乘:
第1步:寫函數
def factorial(n: Int) = 1 to n reduceLeft(_*_)
第2步:定義 "!" 函數
class m1(n: Int) {
def ! = factorial(n)
}
第3步:使用
val n = 100
printf("%d! = %s\n", n, (n!)) // n! 相當于 new m1(n).!()
println(10!)