1. 程式人生 > >scala語法入門

scala語法入門

全棧工程師開發手冊 (作者:欒鵬)

Scala 特性

面向物件特性
Scala是一種純面向物件的語言,每個值都是物件。物件的資料型別以及行為由類和特質描述。

類抽象機制的擴充套件有兩種途徑:一種途徑是子類繼承,另一種途徑是靈活的混入機制。這兩種途徑能避免多重繼承的種種問題。

函數語言程式設計
Scala也是一種函式式語言,其函式也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函式,支援高階函式,允許巢狀多層函式,並支援柯里化。Scala的case class及其內建的模式匹配相當於函數語言程式設計語言中常用的代數型別。

更進一步,程式設計師可以利用Scala的模式匹配,編寫類似正則表示式的程式碼處理XML資料。

靜態型別
Scala具備型別系統,通過編譯時檢查,保證程式碼的安全性和一致性。型別系統具體支援以下特性:

  • 泛型類
  • 協變和逆變
  • 標註
  • 型別引數的上下限約束
  • 把類別和抽象型別作為物件成員
  • 複合型別
  • 引用自己時顯式指定型別
  • 檢視
  • 多型方法

所以你會發現scala和java的語法基本相似。下面根據一個例子學習一下scala的語法。

import java.awt.{Color, Font}   //引入包內的部分成員
import java.awt._  // 引入包內所有成員

import java.util.{HashMap => JavaHashMap}   // 重新命名成員
// 所有類名第一個都要大寫
object demo {
  //  方法名稱第一個要小寫
  def main(args: Array[String]): Unit = {    // def 函式名(引數名:引數型別,引數名:引數型別):返回引數型別={             }
    System.out.println("Hello World!")
    var a = 0;
    // for 迴圈
    for( a <- 1 to 10){  //for迴圈,將1-10之間的數進行遍歷,包含1和10。如果使用1 until 10只包含1,不包含10
      println( "Value of a: " + a );
    }
    // 輸出所有陣列元素
    for ( x <- args ) {
      println( x )
    }
  }


  def addInt( a:Int, b:Int ) : Int = {
    var sum:Int = 0
    sum = a + b

    return sum
  }

  //閉包案例。閉包是一個函式,返回值依賴於宣告在函式外部的一個或多個變數
  def bibao(args: Array[String]) {
    println( "muliplier(1) value = " +  multiplier(1) )
    println( "muliplier(2) value = " +  multiplier(2) )
  }
  var factor = 3
  val multiplier = (i:Int) => i * factor   //匿名的函式

}


var myVar:String = "Too"  //宣告變數
val myVal:String = "Foo"  //宣告常量
var myint = 10;  // 宣告變數可以不給定型別,但是必須給定初始值
val xmax, ymax = 100  // 宣告多個變數,xmax, ymax都宣告為100
val pa = (40,"Foo") //宣告元組


var z1 = new Array[String](3)   //宣告陣列
var z2 = Array("Runoob", "Baidu", "Google")   //宣告並初始化陣列
var myMatrix = ofDim[Int](3,3)   //多維陣列
// 遍歷多維陣列
for (i <- 0 to 2) {
  for ( j <- 0 to 2) {
  myMatrix(i)(j) = j;
}
}

var myList1 = range(10, 20, 2)
var myList2 = range(10,20)

var myList3 =  concat( myList1, myList2)   //合併陣列,copy複製陣列,empty清空陣列,fill填充陣列


/////////////////////////容器///////////////////////////////////
// 定義整型 List
val x1 = List(1,2,3,4)
// 定義 Set
val x2 = Set(1,3,5,7)
// 定義 Map
val x3 = Map("one" -> 1, "two" -> 2, "three" -> 3)
// 建立兩個不同型別元素的元組
val x4 = (10, "Runoob")
// 定義 Option
val x5:Option[Int] = Some(5)

//////////////////////////迭代器///////////////////////////////
val it = Iterator(20,40,2,50,69, 90)

while (it.hasNext){
  println(it.next())
}

println("最大元素是:" + it.max )
println("最小元素是:" + it.min )

println("ita.size 的值: " + it.size )
println("itb.length 的值: " + it.length )

//////////////////////////自定義類///////////////////////
class Point(xc: Int, yc: Int) {  //自定義類接收引數,相當於把java中的類定義和建構函式寫在一起了
  var x: Int = xc
  var y: Int = yc
  //自定義方法
  def move(dx: Int, dy: Int) {
    x = x + dx
    y = y + dy
    println ("x 的座標點: " + x);
    println ("y 的座標點: " + y);
  }
}

///////////////////類的繼承//////////////////////////
class Location(override val xc: Int, override val yc: Int,   //override 重寫了父類的欄位
               val zc :Int) extends Point(xc, yc){    //extends 關鍵字用來繼承,Scala 只允許繼承一個父類。
  var z: Int = zc

  def move(dx: Int, dy: Int, dz: Int) {
    x = x + dx
    y = y + dy
    z = z + dz
    println ("x 的座標點 : " + x);
    println ("y 的座標點 : " + y);
    println ("z 的座標點 : " + z);
  }
}



//////////自定義函式================
def myfun() {
  val pt = new Point(10, 20);
  // 移到一個新的位置
  pt.move(10, 10);

  val loc = new Location(10, 20, 15);
  // 移到一個新的位置
  loc.move(10, 10, 5);
}
//Scala 模式匹配,也就是case函式
def matchTest(x: Any): Any = x match {
  case 1 => "one"
  case "two" => 2
  case y: Int => "scala.Int"
  case _ => "many"
}


////////////////////Trait(特徵)(java介面)//////////////////////
trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}
//繼承介面,和java中一樣
class myclass() extends Equal {

  def isEqual(obj: Any) = true   //實現虛擬函式,這裡是隨意寫的實現函式
}


////////////////////////檔案 I/O///////////////////////////////
val writer = new PrintWriter(new File("test.txt" ))

Scala 陣列方法

方法 描述
def apply( x: T, xs: T* ): Array[T] 建立指定物件 T 的陣列, T 的值可以是 Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean。
def concat[T]( xss: Array[T]* ): Array[T] 合併陣列
def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit 複製一個數組到另一個數組上。相等於 Java’s System.arraycopy(src, srcPos, dest, destPos, length)。
def empty[T]: Array[T] 返回長度為 0 的陣列
def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T] 返回指定長度陣列,每個陣列元素為指定函式的返回值。以下例項陣列初始值為 0,長度為 3,計算函式為a=>a+1:Array.iterate(0,3)(a=>a+1)
def fill[T]( n: Int )(elem: => T): Array[T] 返回陣列,長度為第一個引數指定,同時每個元素使用第二個引數進行填充。
def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]] 返回二陣列,長度為第一個引數指定,同時每個元素使用第二個引數進行填充。
def ofDim[T]( n1: Int ): Array[T] 建立指定長度的陣列
def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]] 建立二維陣列
def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]] 建立三維陣列
def range( start: Int, end: Int, step: Int ): Array[Int] 建立指定區間內的陣列,step 為每個元素間的步長
def range( start: Int, end: Int ): Array[Int] 建立指定區間內的陣列
def tabulate[T]( n: Int )(f: (Int)=> T): Array[T] 返回指定長度陣列,每個陣列元素為指定函式的返回值,預設從 0 開始。以下例項返回 3 個元素:Array.tabulate(3)(a => a + 5)
def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]] 返回指定長度的二維陣列,每個陣列元素為指定函式的返回值,預設從 0 開始。

Scala Iterator 常用方法

下表列出了 Scala Iterator 常用的方法:

方法 描述
def hasNext: Boolean 如果還有可返回的元素,返回true。
def next(): A 返回迭代器的下一個元素,並且更新迭代器的狀態
def ++(that: => Iterator[A]): Iterator[A] 合併兩個迭代器
def ++[B >: A](that :=> GenTraversableOnce[B]): Iterator[B] 合併兩個迭代器
def addString(b: StringBuilder): StringBuilder 新增一個字串到 StringBuilder b
def addString(b: StringBuilder, sep: String): StringBuilder 新增一個字串到 StringBuilder b,並指定分隔符
def buffered: BufferedIterator[A] 迭代器都轉換成 BufferedIterator
def contains(elem: Any): Boolean 檢測迭代器中是否包含指定元素
def copyToArray(xs: Array[A], start: Int, len: Int): Unit 將迭代器中選定的值傳給陣列
def count(p: (A) => Boolean): Int 返回迭代器元素中滿足條件p的元素總數。
def drop(n: Int): Iterator[A] 返回丟棄前n個元素新集合
def dropWhile(p: (A) => Boolean): Iterator[A] 從左向右丟棄元素,直到條件p不成立
def duplicate: (Iterator[A], Iterator[A]) 生成兩個能分別返回迭代器所有元素的迭代器。
def exists(p: (A) => Boolean): Boolean 返回一個布林值,指明迭代器元素中是否存在滿足p的元素。
def filter(p: (A) => Boolean): Iterator[A] 返回一個新迭代器 ,指向迭代器元素中所有滿足條件p的元素。
def filterNot(p: (A) => Boolean): Iterator[A] 返回一個迭代器,指向迭代器元素中不滿足條件p的元素。
def find(p: (A) => Boolean): Option[A] 返回第一個滿足p的元素或None。注意:如果找到滿足條件的元素,迭代器會被置於該元素之後;如果沒有找到,會被置於終點。
def flatMap[B](f: (A) => GenTraversableOnce[B]): Iterator[B] 針對迭代器的序列中的每個元素應用函式f,並返回指向結果序列的迭代器。
def forall(p: (A) => Boolean): Boolean 返回一個布林值,指明 it 所指元素是否都滿足p。
def foreach(f: (A) => Unit): Unit 在迭代器返回的每個元素上執行指定的程式 f
def hasDefiniteSize: Boolean 如果迭代器的元素個數有限則返回true(預設等同於isEmpty)
def indexOf(elem: B): Int 返回迭代器的元素中index等於x的第一個元素。注意:迭代器會越過這個元素。
def indexWhere(p: (A) => Boolean): Int 返回迭代器的元素中下標滿足條件p的元素。注意:迭代器會越過這個元素。
def isEmpty: Boolean 檢查it是否為空, 為空返回 true,否則返回false(與hasNext相反)。
def isTraversableAgain: Boolean Tests whether this Iterator can be repeatedly traversed.
def length: Int 返回迭代器元素的數量。
def map[B](f: (A) => B): Iterator[B] 將 it 中的每個元素傳入函式 f 後的結果生成新的迭代器。
def max: A 返回迭代器迭代器元素中最大的元素。
def min: A 返回迭代器迭代器元素中最小的元素。
def mkString: String 將迭代器所有元素轉換成字串。
def mkString(sep: String): String 將迭代器所有元素轉換成字串,並指定分隔符。
def nonEmpty: Boolean 檢查容器中是否包含元素(相當於 hasNext)。
def padTo(len: Int, elem: A): Iterator[A] 首先返回迭代器所有元素,追加拷貝 elem 直到長度達到 len。
def patch(from: Int, patchElems: Iterator[B], replaced: Int): Iterator[B] 返回一個新迭代器,其中自第 from 個元素開始的 replaced 個元素被迭代器所指元素替換。
def product: A 返回迭代器所指數值型元素的積。
def sameElements(that: Iterator[_]): Boolean 判斷迭代器和指定的迭代器引數是否依次返回相同元素
def seq: Iterator[A] 返回集合的系列檢視
def size: Int 返回迭代器的元素數量
def slice(from: Int, until: Int): Iterator[A] 返回一個新的迭代器,指向迭代器所指向的序列中從開始於第 from 個元素、結束於第 until 個元素的片段。
def sum: A 返回迭代器所指數值型元素的和
def take(n: Int): Iterator[A] 返回前 n 個元素的新迭代器。
def toArray: Array[A] 將迭代器指向的所有元素歸入陣列並返回。
def toBuffer: Buffer[B] 將迭代器指向的所有元素拷貝至緩衝區 Buffer。
def toIterable: Iterable[A] Returns an Iterable containing all elements of this traversable or iterator. This will not terminate for infinite iterators.
def toIterator: Iterator[A] 把迭代器的所有元素歸入一個Iterator容器並返回。
def toList: List[A] 把迭代器的所有元素歸入列表並返回
def toMap[T, U]: Map[T, U] 將迭代器的所有鍵值對歸入一個Map並返回。
def toSeq: Seq[A] 將代器的所有元素歸入一個Seq容器並返回。
def toString(): String 將迭代器轉換為字串
def zip[B](that: Iterator[B]): Iterator[(A, B) 返回一個新迭代器,指向分別由迭代器和指定的迭代器 that 元素一一對應而成的二元組序列