Scala基本語法學習筆記

 
Scala語法與JAVA有不少類似的地方,二者也能夠相互調用。可是總體感受Scala語法等簡潔、靈活。這裏記錄下Scala有特色的地方,以備之後查找方便。
 
參考:
使用 import:
Scala教程:
scala class和object,trait的區別:
scala中 object 和 class的區別:
 
1. import
1)基本語法跟JAVA相同:
import scala.io.StdIn
2)引用兩個相同包下的類:
import java.io.{File, PrintWriter}
3)引用包下的全部類:
import java.io._ (至關於JAVA的import java.io.*)
4)排除(隱藏)引用:
import java.io.{Console=>_,_} (引用初java.io下除Console以外的全部類)
 
2. for循環比Java更靈活
1)標準for: i to j 語法(包含 j)
for( a <- 1 to 10 ) {
println("for[1 to 10] a: " + a)
}
println("---------------");
 
2)標準for: i until j 語法(不包含 j)
for( a <- 1 until 10 ) {
println("for[1 until 10] a: " + a)
}
println("---------------");
 
3)使用分號 (;) 來設置多個區間,它將迭代給定區間全部的可能值(至關於多重循環):
for( a <- 1 to 3; b <- 1 to 3 ) {
println("for[a;b] a: " + a + ", b: " + b)
}
println("---------------");
 
4)for集合: List 變量是一個集合,for 循環會迭代全部集合的元素
val numList = List(1,2,3,4,5,6)
for( a <- numList ) {
println("for[List] a: " + a)
}
println("---------------");
 
5)使用循環過濾,在for里加入if條件,多個條件用「;」隔開:
val numList2 = List(1,2,3,4,5,6,7,8,9,10)
for( a <- numList2
if a!=3; if a<8) {
println("for[List+filter] a: " + a)
}
println("---------------");
 
6)使用 yield:能夠將 for 循環的返回值做爲一個變量存儲
val numList3 = List(1,2,3,4,5,6,7,8,9,10)
var retVal = for{ a <- numList3
if a!=3; if a<9
}yield a
 
for( a <- retVal ) {
println("for[List+filter+yield] a: " + a)
}
 
3. Option
Scala鼓勵函數返回Option類型的值,有值則返回Some(),不然返回None
示例:
/**
* Scala Option(選項)類型用來表示一個值是可選的(有值或無值)。
* Option[T] 是一個類型爲 T 的可選值的容器: 若是值存在, Option[T] 就是一個 Some[T] ,若是不存在, Option[T] 就是對象 None 。
* Option 有兩個子類別,一個是 Some,一個是 None,當他回傳 Some 的時候,表明這個函式成功地給了你一個 String,而你能夠透過 get() 這個函式拿到那個 String,若是他返回的是 None,則表明沒有字符串能夠給你。
*/
object OptionTest {
 
def main(args: Array[String]): Unit = {
 
val sites = Map("runoob" -> "www.runoob.com", "google" -> "www.google.com")
 
println("sistes.get runoob : " + sites.get("runoob")) //get() 返回的是一個叫 Option[String] 的類別
println("sistes.get baidu : " + sites.get("baidu"))
println("------------")
 
//use match-case
println("show(sistes.get runoob) : " + show(sites.get("runoob"))) //get() 返回的是一個叫 Option[String] 的類別
println("show(sistes.get baidu) : " + show(sites.get("baidu")))
println("------------")
 
//use getOrElse
println("getOrElse(sistes.get runoob) : " + sites.get("runoob").getOrElse("there is no")) //get()不是None則返回value
println("getOrElse(sistes.get baidu) : " + sites.get("baidu").getOrElse("there is no")) //get()不到value則返回getOrElse傳入做爲默認值
println("------------")
 
//use isEmpty
println("isEmpty(sistes.get runoob) : " + sites.get("runoob").isEmpty) //返回false
println("isEmpty(sistes.get baidu) : " + sites.get("baidu").isEmpty) //返回true
println("------------")
 
}
 
def show(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
}
 
輸出結果:
sistes.get runoob : Some(www.runoob.com)
sistes.get baidu : None
------------
show(sistes.get runoob) : www.runoob.com
show(sistes.get baidu) : ?
------------
getOrElse(sistes.get runoob) : www.runoob.com
getOrElse(sistes.get baidu) : there is no
------------
isEmpty(sistes.get runoob) : false
isEmpty(sistes.get baidu) : true
------------
 
4. val 和 var
Scala有兩種變量,val和var。
val不能再賦值,至關於JAVA的final
var能夠被屢次賦值。
 
5. 函數定義
1)函數聲明
格式以下:
def functionName ([參數列表]) : [return type]
若是你不寫等於號和方法主體,那麼方法會被隱式聲明爲"抽象(abstract)",包含它的類型因而也是一個抽象類型。
 
2)函數定義
方法定義由一個def 關鍵字開始,緊接着是可選的參數列表,一個冒號":" 和方法的返回類型,一個等於號"=",最後是方法的主體。
格式以下:
def functionName ([參數列表]) : [return type] = {
function body
return [expr]
}
以上代碼中 return type 能夠是任意合法的 Scala 數據類型。參數列表中的參數可使用逗號分隔。
若是函數沒有返回值,能夠返回爲 Unit,這個相似於 Java 的 void。
 
3)main函數定義以下:
def main(args: Array[String]): Unit = {
println("hello world!"))
}
 
6. class、 object 和 trait
1)object
在scala中沒有靜態方法和靜態字段,因此在scala中能夠用object來實現這些功能,直接用對象名調用的方法都是採用這種實現方式,例如Array.toString。對象的構造器在第一次使用的時候會被調用,若是一個對象從未被使用,那麼他的構造器也不會被執行;對象本質上擁有類(scala中)的全部特性,除此以外,object還能夠一擴展類以及一個或者多個特質:例如,
 
abstract class ClassName(val parameter){}
object Test extends ClassName(val parameter){}
 
trait TraitA{}
trait TraitB{}
trait TraitC{}
object Test1 extends TraitA with TraitB with TraitC{}
 
注意:object不能提供構造器參數,也就是說object必須是無參的
 
咱們一般會定義和使用object的apply方法,有以下情形,apply方法就會被調用,Object(參數1 ,參數2 ,……)這樣是隱含的調用apply方法,固然也能夠顯示的調用,以下Array("Mary","tong"),固然也能夠這樣來寫Array.apply("Mary","tong"),通常咱們提倡隱式的寫法。
 
全部的main方法都必須在object中被調用,來提供程序的主入口,十分簡單,不舉例說明,處理main方法之外,scala中還提供了擴展App特質,而後將程序代碼放入都早起方法體內,如
 
object Hello extends App{
println("Hello World !!!")
}
 
這樣的代碼能夠直接執行,輸出
若是須要命令行參數,能夠直接調用args屬性來獲得,例如
 
def main(args: Array[String]) {
if (args.length > 0 )
println("Hello " + args(0))
else
println("Hello World")
}
scala中並無枚舉類型,可是,標準類庫中提供了一個枚舉類型的接口,在object下面,能夠擴展出枚舉類型(Enumeration),
具體示例以下:
object EnumerationDemo extends Enumeration{
val red, green, blue, pink = Value
val black = Value // 上面一條語句是簡寫
val white = Value
val gray = Value
val yellow = Value(12, "huang") //能夠隨意指定id和名稱,可是避免重複
val purple = Value("zi") //id爲13
val orange = Value(20)
}
上面的代碼爲實現枚舉類型的具體代碼,若是不指定id和name,系統默認是id從0開始,name就是變量的名稱,能夠指定其中的
任何一個或者是兩個所有指定,已經指定的就按指定的初始化,而且後面的依次遞增。
 
枚舉的引用
能夠直接objectName.red這樣來進行引用,也能夠將import objectName._來進行導入引用,還能夠給枚舉類型增長一個類型別名,
具體以下:
object EnumerationDemo extends Enumeration{
type EnumerationDemo = Value
val red, green, blue, pink = Value
val black = Value
val white = Value
val gray = Value
val yellow = Value(12, "huang")
val purple = Value("zi")
val orange = Value(20)
}
如今枚舉類型變成了EnumerationDemo.EnumerationDemo 這種用法只有在使用import語句的時候才顯得有意義。
package enumeration
import EnumerationDemo._
/**
* Created by tongtong on 2015/9/8.
*
*/
class EnumDemo {
def transportation(color:Enumeration): Unit ={
if (color == red)
"Stop"
else if (color == green)
"go"
else if (color == yellow)
"wait"
}
}
枚舉類型也能夠經過for循環將全部元素輸出,同時能夠經過Enumeration(Int)和Enumeration.withName("")來進行
定位操做
 
2)class
在scala中,類名能夠和對象名爲同一個名字,該對象稱爲該類的伴生對象,類和伴生對象能夠相互訪問他們的私有屬性,可是
他們必須在同一個源文件內。類只會被編譯,不能直接被執行,類的申明和主構造器在一塊兒被申明,在一個類中,主構造器只有一個,
全部必須在內部申明主構造器或者是其餘申明主構造器的輔構造器,主構造器會執行類定義中的全部語句。scala對每一個字段都會提供
getter和setter方法,同時也能夠顯示的申明,可是針對val類型,只提供getter方法,默認狀況下,字段爲公有類型,能夠在setter
方法中增長限制條件來限定變量的變化範圍,在scala中方法能夠訪問改類全部對象的私有字段
 
3)trait
在java中能夠經過interface實現多重繼承,在Scala中能夠經過特徵(trait)實現多重繼承,不過與java不一樣的是,它能夠定義本身的屬性和實現方法體,在沒有本身的實現方法體時能夠認爲它時java interface是等價的,在Scala中也是通常只能繼承一個父類,能夠經過多個with進行多重繼承。
相關文章
相關標籤/搜索