1. 程式人生 > >Scala一種程式語言

Scala一種程式語言

scala

安裝

安裝scala

去官網下載scala2.11.8(spark使用2.1.2對應scala版本是2.11.8)

下載scala-2.11.8.msi(安裝)或scala-2.11.8.zip(解壓)

注意:scala安裝目錄不能有中文和空格(特殊符號)

安裝idea

下一步。。。。

configurens--》plugins--》搜尋  “scala”--》install ---》 restart intellij

new project --》 選擇scala --》選擇IDEA -->next---》填寫工程名  --》

jdk路徑(選擇本地的jdk1.8安裝目錄) --》 scala sdk --》scala安裝目錄--》finish

 

特點

面向物件     1+2  (1).+(2)

函式式

相容的

簡潔的

高層級的

靜態型別的

互動模式

 

定義變數

val 常量(推薦)

var 變數

型別推斷

這種 Scala能自動理解你省略的型別的能力

 

val msg2: java.lang.String = "Hello again, world!"

指定型別 變數:型別 = 值

定義函式

def 函式名(引數列表[變數名:型別]):結果型別 = {

方法體

 

 

list(不可變型別必須一致)

List() 或 Nil  空 List

List("Cool", "tools", "rule)   建立帶有三個值"Cool","tools"和"rule"的新 List[String]

val thrill = "Will"::"fill"::"until"::Nil   建立帶有三個值"Will","fill"和"until"的新 List[String]

List("a", "b") ::: List("c", "d")   疊加兩個列表(返回帶"a","b","c"和"d"的新List[String])

thrill(2)   返回在 thrill 列表上索引為 2(基於0)的元素(返回"until")

thrill.count(s => s.length == 4)   計算長度為 4 的 String 元素個數(返回 2)

thrill.drop(2)   返回去掉前 2 個元素的thrill 列表(返回 List("until"))

thrill.dropRight(2)   返回去掉後 2 個元素的thrill 列表(返回 List("Will"))

thrill.exists(s => s == "until")   判斷是否有值為"until"的字串元素在 thrill 裡(返回 true)

thrill.filter(s => s.length == 4)   依次返回所有長度為 4 的元素組成的列表(返回 List("Will","fill"))

thrill.forall(s => s.endsWith("1"))   辨別是否 thrill 列表裡所有元素都以"l"結尾(返回 true)

thrill.foreach(s => print(s))   對 thrill 列表每個字串執行 print 語句("Willfilluntil")

thrill.foreach(print)   與前相同,不過更簡潔(同上)

thrill.head   返回 thrill 列表的第一個元素(返回"Will")

thrill.init   返回 thrill 列表除最後一個以外其他元素組成的列表(返回List("Will", "fill"))

thrill.isEmpty   說明 thrill 列表是否為空(返回false)

thrill.last   返回 thrill 列表的最後一個元素(返回"until")

thrill.length   返回 thrill 列表的元素數量(返回3)

thrill.map(s => s + "y")   返回由 thrill 列表裡每一個 String 元素都加了"y"構成的列表(返回 List("Willy", "filly", "untily"))

thrill.mkString(", ")   用列表的元素建立字串(返回"will, fill, until")

thrill.remove(s => s.length == 4)   返回去除了 thrill 列表中長度為 4 的元素後依次排列的元素列表(返回 List("until"))

thrill.reverse   返回含有 thrill 列表的逆序元素的列表(返回 List("until","fill", "Will"))

thrill.sort((s, t) =>s.charAt(0).toLowerCase <t.charAt(0).toLowerCase)

返回包括 thrill 列表所有元素,並且第一個字元小寫按照字母順序排列的列表(返回List("fill", "until", "Will"))

thrill.tail   返回除掉第一個元素的 thrill 列表(返回 List("fill","until"))

 

Tuple(不可變型別可以不一致)

 

Set

可變scala.collection.mutable.Set

不可變scala.collection.immutable.Set

 

map

可變scala.collection.mutable.Map

不可變scala.collection.immutable.Map

 

---------------------------------------------------

1.方法中的花括號有2種意思:

1)scala中函式的小括號,可以用花括號來表示,即foo{xx} 與 foo(xx)是一回事兒。

2)對於只有一個引數的方法,其小括號是可以省略的,map(lambda)可寫為 map lambda,即這塊{case (key,value) => value} 連同花括號整體是一個lambda(函式字面量)。

 

//    花括號和小括號的區別

    val raw = List(("a",1),("b",2),("c",3))

    val res = raw.map{ case (key,value) => value }.reduce(_ + _)

    println(res)

 

 

2.{case x => y} 叫做偏函式(必須用大括號“{}”,使用“()”會報錯)。 與完全函式想對應,普通的方法都是完全函式,即f(i:Int) = xxx 是將所有Int型別作為引數的,是對整個Int集的對映;而偏函式則是對部分資料的對映

//    2.case偏函式    

val res2 =List(1,2,3).map{

      case 1 => "first"

      case 2 => "second"

      case _ => "other"

 

3.變長引數

有時候,函式需要一個可變長度的引數。在scala中是容易實現的:

注意呼叫的時候使用:_*,將序列或者集合的內容全部當做引數來傳遞。

//    3.變長引數      

def sum(args:Int*)={

        var result = 0

        for(arg <- args) result +=arg

        print (result)

      }

       val s = sum (1 to 5:_*)

 

 

12.03

類:

類似java

class 類名

 

屬性

val(不可變)或var(可變) 變數名 = 值

 

方法

del 方法名(引數):結果型別 = {方法體}

 

訪問許可權

private與java類似

Singleton  物件

Scala 比 Java 更面向物件的一個方面是 Scala 沒有靜態成員。替代品是,

Scala 有: 單例物件:singleton object。

當單例物件與某個類共享同一個名稱時,他被稱作是這個類的 伴生物件

你必須在同一個原始檔裡定義類和它的伴生物件。

類被稱為是這個單例物件的 伴生類:companionclass。

類和它的伴生物件可以互相訪問其私有成員。

 

scala程式

要執行 Scala 程式,你一定要提供一個有 main 方法

(僅帶一個引數, Array[String] ,且結果型別為 Unit )的孤立單例物件名

 

Application 特質

可以不寫main方法直接執行,繼承Application

object 物件名 extends Application {

此處語句可以直接執行,不需要main方法

 

args 陣列不可訪問

某些 JVM執行緒模型裡的侷限,使用多執行緒必須寫main

 

基本資料型別:

java中八個加上String

 

中置操作符

操作符位於兩個引數之間

一元操作符

只有一個引數的操作符

 

結合性

所有操作符都是左結合(從左到右計算)

:和賦值是右結合

 

scala高階函式

接收函式引數的函式

 

 

 

函數語言程式設計

--------------------------------------------

    函數語言程式設計的特點

        函數語言程式設計核心價值在於多核程式設計。

        1) 引數私有,沒有執行緒安全問題,這樣就為分散式高併發提供了支援

        2) 把函式做為引數

        3) 把函式的返回值作為引數

    定義:在js中方法和函式比較模糊。scala中的函式和方法不同,函式在scala中是一等公民。

    格式:(引數:型別):返回值型別 => { 表示式; 表示式... }

    函式可以被賦值給其他變數或常量,可以作為引數傳遞,也可以作為返回值      

  object TestFunction {

          def add(a:Int,b:Int) = { a+b }          //定義物件的方法

          def main(args: Array[String]): Unit = {

            val fnadd = (a:Int,b:Int) => { a+b }  //定義函式

            println(fnadd(10,20))

          }

        }

------------------------------------------------------------------------------------------------------------------------

函式程式設計的威力

    任務:已存在一個數字集合,按照奇偶數分成兩個集合,下面是java的實現

    java實現:       

 List<Integer> list = new ArrayList<Integer>();

        list.add(1); list.add(2); list.add(3); list.add(4); list.add(5);

        List<Integer> a = new ArrayList<Integer>();

        List<Integer> b = new ArrayList<Integer>();

        for(Integer n: list){

            if(n%2 == 0){

                a.add(n);

            }else{

                b.add(n);

            }

        }

    scala實現        

object list {

          def main(args: Array[String]): Unit = {

            //按奇偶數將集合劃分為兩個

            val f2 = (n:Int) => {n%2 != 0}       //函式遇到奇數返回true,偶數返回false

            val array = Array(1,2,3,4,5).toList  //初始化陣列

            println(array.partition(f2))      // partition分割槽的意思



            //還可以簡寫為

            println(array.partition((n:Int) => {n%2 != 0}))

          }

        }

 

        結果:(List(1, 3, 5),List(2, 4))

        可以看到函數語言程式設計的好處,讓程式碼變的簡單。

        以前面向物件是做抽象、繼承、封裝、多型,以物件的觀點去寫我們的程式。函數語言程式設計把程式碼寫在一個一個小的函式中,想辦法把業務化成一塊一塊的內容,組合起來完成一個業務。

------------------------------------------------------------------------------------------------------------------------

函式式的foreach   

 val list2 = List(1,2,3,4,5)

    list2.foreach { x => println(x) }

        【foreach原始碼說明】:

            def foreach[U](f: A => U) {      //f是一個函式,A、U都是泛型

                var these = this

                while (!these.isEmpty) {

                  f(these.head)      //.head獲取到頭元素也就是第一個元素

                  these = these.tail  //.tail獲取到除第一元素後的所有元素

                }

            }

 

 

 

集合操作

------------------------------

        def ++[B](that: GenTraversableOnce[B]): Array[B]

合併集合,並返回一個新的陣列,新陣列包含左右兩個集合物件的內容。型別返回已左側為準!!    

val a = Array(1,2,3)

    val b = Array(3,4,5)

    val c = a ++ b

    //c中的內容是(1,2,3,3,4,5)

--------------------------------------------------------------------------------------------------------------------------------------

def ++:[B >: A, That](that: collection.Traversable[B])(implicit bf: CanBuildFrom[Array[T], B, That]): That

這個方法同上一個方法類似,兩個加號後面多了一個冒號,但是不同的是右邊操縱數的型別決定著返回結果的型別。    

val a = List(1,2)

    val b = scala.collection.mutable.LinkedList(3,4)

    val c = a ++: b

    println(c.getClass().getName())

// c的型別是:scala.collection.mutable.LinkedList

--------------------------------------------------------------------------------------------------------------------------------------

def +:(elem: A): Array[A]

在陣列前面新增一個元素,並返回新的物件,下面新增一個元素 0   

 val a = List(1,2)

    val c = 0 +: a 

// c中的內容是 (0,1,2)

--------------------------------------------------------------------------------------------------------------------------------------

def :+(elem: A): Array[A]

同上面的方法想法,在陣列末尾新增一個元素,並返回新物件

--------------------------------------------------------------------------------------------------------------------------------------

def addString(b: StringBuilder): StringBuilder

將陣列中的元素逐個新增到b中   

 val a = List(1,2,3,4)

    val b = new StringBuilder()

    val c = a.addString(b)

  // c中的內容是  1234

--------------------------------------------------------------------------------------------------------------------------------------

def addString(b: StringBuilder, sep: String): StringBuilder

同上,每個元素用sep分隔符分開   

 val a = List(1,2,3,4)

    val b = new StringBuilder()

    val c = a.addString(b,",")

    println("c:  "+c)  

// c:  1,2,3,4

--------------------------------------------------------------------------------------------------------------------------------------

def addString(b: StringBuilder, start: String, sep: String, end: String): StringBuilder

同上,在首尾各加一個字串,並指定sep分隔符    

val a = List(1,2,3,4)

    val b = new StringBuilder()

    val c = a.addString(b,"{",",","}")

    println("c:  "+c)  

// c:  {1,2,3,4}

--------------------------------------------------------------------------------------------------------------------------------------

   def mkString: String

將所有元素組合成一個字串   

 val a = Array(1, 2, 3, 4, 5)

    println(a.mkString) 

// return  12345

**************************************************************************************************************************************

   def mkString(sep: String): String

將所有元素組合成一個字串,以 sep 作為元素間的分隔符    

val a = Array(1, 2, 3, 4, 5)

    println(a.mkString(","))  

  // return  1,2,3,4,5

**************************************************************************************************************************************

   def mkString(start: String, sep: String, end: String): String

將所有元素組合成一個字串,以 start 開頭,以 sep 作為元素間的分隔符,以 end 結尾    

val a = Array(1, 2, 3, 4, 5)

    println(a.mkString("{",",","}"))   

 // return  {1,2,3,4,5}

**************************************************************************************************************************************

def aggregate[B](z: => B)(seqop: (B, T) => B, combop: (B, B) => B): B

聚合計算,aggregate是柯里化方法,引數是兩個方法,為了方便理解,我們把aggregate的兩個引數,分別封裝成兩個方法,並把計算過程打印出來。 

 def main(args: Array[String]) {

    val a = List(1,2,3,4)

    val c = a.par.aggregate(5)(seqno,combine)

    println("c:"+c)

  }

  def seqno(m:Int,n:Int): Int ={

    val s = "seq_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

  def combine(m:Int,n:Int): Int ={

    val s = "com_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

  /**

    seq_exp=5+3

    seq_exp=5+2

    seq_exp=5+4

    seq_exp=5+1

    com_exp=6+7

    com_exp=8+9

    com_exp=13+17

    c:30

  */

    上面過程可以簡寫為

    val c = a.par.aggregate(5)(_+_,_+_)

 

 

12.04

def apply(i: Int): T

同下面程式碼,取出指定索引處的元素

    val first = numbers(0) // 讀取第一個元素

--------------------------------------------------------------------------------------------------------------------------------------

def canEqual(that: Any): Boolean

判斷兩個物件是否可以進行比較

--------------------------------------------------------------------------------------------------------------------------------------

def charAt(index: Int): Char

獲取index索引處的字元,這個方法會執行一個隱式的轉換,將Array[T]轉換為 ArrayCharSequence,只有當T為char型別時,這個轉換才會發生。    

val chars = Array('a','b','c')

    println("c:"+chars.charAt(0))

  //結果 a

--------------------------------------------------------------------------------------------------------------------------------------

def clone(): Array[T]

建立一個副本    

val chars = Array('a','b','c')

    val newchars = chars.clone()

--------------------------------------------------------------------------------------------------------------------------------------

def collect[B](pf: PartialFunction[A, B]): Array[B]

通過執行一個平行計算(偏函式),得到一個新的陣列物件  

 val chars = Array('a','b','c')

   val newchars = chars.collect(fun)

   println("newchars:"+newchars.mkString(","))

  //我們通過下面的偏函式,把chars陣列的小寫a轉換為大寫的A

  val fun:PartialFunction[Char,Char] = {

    case 'a' => 'A'

    case x => x

  }

  /**輸出結果是 newchars:A,b,c */

--------------------------------------------------------------------------------------------------------------------------------------

def collectFirst[B](pf: PartialFunction[T, B]): Option[B]

在序列中查詢第一個符合偏函式定義的元素,並執行偏函式計算

val arr = Array(1,'a',"b")

//定義一個偏函式,要求當被執行物件為Int型別時,進行乘100的操作,對於上面定義的物件arr來說,只有第一個元素符合要求

  val fun:PartialFunction[Any,Int] = {

    case x:Int => x*100

  }

//計算 

 val value = arr.collectFirst(fun)

  println("value:"+value)

//另一種寫法

    val value = arr.collectFirst({case x:Int => x*100})

--------------------------------------------------------------------------------------------------------------------------------------

def combinations(n: Int): collection.Iterator[Array[T]]

排列組合,這個排列組合會選出所有包含字元不一樣的組合,對於 “abc”、“cba”,只選擇一個,引數n表示序列長度,就是幾個字元為一組    

val arr = Array("a","b","c")

    val newarr = arr.combinations(2)

    newarr.foreach((item) => println(item.mkString(",")))

    /**

a,b

a,c

b,c

    */

--------------------------------------------------------------------------------------------------------------------------------------

def contains[A1 >: A](elem: A1): Boolean

序列中是否包含指定物件

--------------------------------------------------------------------------------------------------------------------------------------

def containsSlice[B](that: GenSeq[B]): Boolean

判斷當前序列中是否包含另一個序列   

 val a = List(1,2,3,4)

    val b = List(2,3)

    println(a.containsSlice(b)) 

 //true

--------------------------------------------------------------------------------------------------------------------------------------

def copyToArray(xs: Array[A]): Unit

此方法還有兩個類似的方法

    copyToArray(xs: Array[A], start: Int): Unit

    copyToArray(xs: Array[A], start: Int, len: Int): Unit

    val a = Array('a', 'b', 'c')

    val b : Array[Char] = new Array(5)

    a.copyToArray(b)    /**b中元素 ['a','b','c',0,0]*/

    a.copyToArray(b,1)  /**b中元素 [0,'a',b,c,0]*/

    a.copyToArray(b,1,2)    /**b中元素 [0,'a','b',0,0]*/

--------------------------------------------------------------------------------------------------------------------------------------

def copyToBuffer[B >: A](dest: Buffer[B]): Unit

將陣列中的內容拷貝到Buffer中

    val a = Array('a', 'b', 'c')

    val b:ArrayBuffer[Char]  = ArrayBuffer()

    a.copyToBuffer(b)

    println(b.mkString(","))

--------------------------------------------------------------------------------------------------------------------------------------

def corresponds[B](that: GenSeq[B])(p: (T, B) => Boolean): Boolean

判斷兩個序列長度以及對應位置元素是否符合某個條件。如果兩個序列具有相同的元素數量並且p(x, y)=true,返回結果為true

下面程式碼檢查a和b長度是否相等,並且a中元素是否小於b中對應位置的元素

    val a = Array(1, 2, 3)

    val b = Array(4, 5,6)

    println(a.corresponds(b)(_<_))  //true

--------------------------------------------------------------------------------------------------------------------------------------

def count(p: (T) => Boolean): Int

統計符合條件的元素個數,下面統計大於 2 的元素個數

    val a = Array(1, 2, 3)

    println(a.count({x:Int => x > 2}))  // count = 1

--------------------------------------------------------------------------------------------------------------------------------------

def diff(that: collection.Seq[T]): Array[T]

計算當前陣列與另一個數組的不同。將當前陣列中沒有在另一個數組中出現的元素返回

    val a = Array(1, 2, 3,4)

    val b = Array(4, 5,6,7)

    val c = a.diff(b)

    println(c.mkString) //1,2,3

--------------------------------------------------------------------------------------------------------------------------------------

def distinct: Array[T]

去除當前集合中重複的元素,只保留一個

    val a = Array(1, 2, 3,4,4,5,6,6)

    val c = a.distinct

    println(c.mkString(","))    // 1,2,3,4,5,6

--------------------------------------------------------------------------------------------------------------------------------------

def drop(n: Int): Array[T]

將當前序列中前 n 個元素去除後,作為一個新序列返回

    val a = Array(1, 2, 3,4)

    val c = a.drop(2)

    println(c.mkString(","))    // 3,4

--------------------------------------------------------------------------------------------------------------------------------------

def dropRight(n: Int): Array[T]

功能同 drop,去掉尾部的 n 個元素

def dropWhile(p: (T) => Boolean): Array[T]

去除當前陣列中符合條件的元素,這個需要一個條件,就是從當前陣列的第一個元素起,就要滿足條件,直到碰到第一個不滿足條件的元素結束(即使後面還有符合條件的元素),否則返回整個陣列

//下面去除大於2的,第一個元素 3 滿足,它後面的元素 2 不滿足,所以返回 2,3,4

    val a = Array(3, 2, 3,4)

    val c = a.dropWhile( {x:Int => x > 2} )

    println(c.mkString(","))

 

//如果陣列 a 是下面這樣,第一個元素就不滿足,所以返回整個陣列 1, 2, 3,4

    val a = Array(1, 2, 3,4)

--------------------------------------------------------------------------------------------------------------------------------------

def endsWith[B](that: GenSeq[B]): Boolean

判斷是否以某個序列結尾

    val a = Array(3, 2, 3,4)

    val b = Array(3,4)

    println(a.endsWith(b))  //true

--------------------------------------------------------------------------------------------------------------------------------------

def exists(p: (T) => Boolean): Boolean

判斷當前陣列是否包含符合條件的元素

     val a = Array(3, 2, 3,4)

     println(a.exists( {x:Int => x==3} ))   //true

     println(a.exists( {x:Int => x==30} ))  //false

--------------------------------------------------------------------------------------------------------------------------------------

def filter(p: (T) => Boolean): Array[T]

取得當前陣列中符合條件的元素,組成新的陣列返回

    val a = Array(3, 2, 3,4)

    val b = a.filter( {x:Int => x> 2} )

    println(b.mkString(","))    //3,3,4

--------------------------------------------------------------------------------------------------------------------------------------

def filterNot(p: (T) => Boolean): Array[T]

與上面的 filter 作用相反

def find(p: (T) => Boolean): Option[T]

查詢第一個符合條件的元素

    val a = Array(1, 2, 3,4)

    val b = a.find( {x:Int => x>2} )

    println(b)  // Some(3)

--------------------------------------------------------------------------------------------------------------------------------------

def flatMap[B](f: (A) => GenTraversableOnce[B]): Array[B]

對當前序列的每個元素進行操作,結果放入新序列返回,引數要求是GenTraversableOnce及其子類

    val a = Array(1, 2, 3,4)

    val b = a.flatMap(x=>1 to x)

    println(b.mkString(","))

    /**

1,1,2,1,2,3,1,2,3,4

從1開始,分別於集合a的每個元素生成一個遞增序列,過程如下

1

1,2

1,2,3

1,2,3,4

    */

--------------------------------------------------------------------------------------------------------------------------------------

def flatten[U](implicit asTrav: (T) => collection.Traversable[U], m: ClassTag[U]): Array[U]

將二維陣列的所有元素聯合在一起,形成一個一維陣列返回

    val dArr = Array(Array(1,2,3),Array(4,5,6))

    val c = dArr.flatten

    println(c.mkString(","))    //1,2,3,4,5,6

        -------------------------------------------------------------------------------

-def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1

對序列中的每個元素進行二元運算,和aggregate有類似的語義,但執行過程有所不同,我們來對比一下他們的執行過程。

因為aggregate需要兩個處理方法,所以我們定義一個combine方法

  def seqno(m:Int,n:Int): Int ={

    val s = "seq_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

  def combine(m:Int,n:Int): Int ={

    val s = "com_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

    val a = Array(1, 2, 3,4)

    val b = a.fold(5)(seqno)

    /** 運算過程

    seq_exp=5+1

    seq_exp=6+2

    seq_exp=8+3

    seq_exp=11+4

    */

    val c = a.par.aggregate(5)(seqno,combine)

    /** 運算過程

    seq_exp=5+1

    seq_exp=5+4

    seq_exp=5+3

    com_exp=8+9

    seq_exp=5+2

    com_exp=6+7

    com_exp=13+17

    */

看上面的運算過程發現,fold中,seqno是把初始值順序和每個元素相加,把得到的結果與下一個元素進行運算

而aggregate中,seqno是把初始值與每個元素相加,但結果不參與下一步運算,而是放到另一個序列中,由第二個方法combine進行處理

**************************************************************************************************************************************

-def foldLeft[B](z: B)(op: (B, T) => B): B

從左到右計算,簡寫方式:def /:[B](z: B)(op: (B, T) => B): B

  def seqno(m:Int,n:Int): Int ={

    val s = "seq_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

    val a = Array(1, 2, 3,4)

    val b = a.foldLeft(5)(seqno)

    /** 運算過程

    seq_exp=5+1

    seq_exp=6+2

    seq_exp=8+3

    seq_exp=11+4

    */

    /**

簡寫 (5 /: a)(_+_)

    */

**************************************************************************************************************************************

-def foldRight[B](z: B)(op: (B, T) => B): B

從右到左計算,簡寫方式:def :\[B](z: B)(op: (T, B) => B): B

  def seqno(m:Int,n:Int): Int ={

    val s = "seq_exp=%d+%d"

    println(s.format(m,n))

    return m+n

  }

    val a = Array(1, 2, 3,4)

    val b = a.foldRight(5)(seqno)

    /** 運算過程

seq_exp=4+5

seq_exp=3+9

seq_exp=2+12

seq_exp=1+14

*/

/**

簡寫 (a :\ 5)(_+_)

    */

**************************************************************************************************************************************

--------------------------------------------------------------------------------------------------------------------------------------

def /:[B](z: B)(op: (B, T) => B): B

對陣列中所有的元素進行相同的操作 ,foldLeft的簡寫

    val a = List(1,2,3,4)

    val c = (10 /: a)(_+_)   // 1+2+3+4+10

    val d = (10 /: a)(_*_)   // 1*2*3*4*10

    println("c:"+c)   // c:20

    println("d:"+d)   // d:240

--------------------------------------------------------------------------------------------------------------------------------------

def :\[B](z: B)(op: (T, B) => B): B

foldRight的簡寫

-------------------------------------------------------------------------------------------------------------------

-def forall(p: (T) => Boolean): Boolean

檢測序列中的元素是否都滿足條件 p,如果序列為空,返回true

    val a = Array(1, 2, 3,4)

    val b = a.forall( {x:Int => x>0})   //true

    val b = a.forall( {x:Int => x>2})   //false

**************************************************************************************************************************************

 

-def foreach(f: (A) => Unit): Unit

遍歷序列中的元素,進行 f 操作

    val a = Array(1, 2, 3,4)

    a.foreach(x => println(x*10))

    /**

10

20

30

40

    */

**************************************************************************************************************************************

-def groupBy[K](f: (T) => K): Map[K, Array[T]]

按條件分組,條件由 f 匹配,返回值是Map型別,每個key對應一個序列,下面程式碼實現的是,把小於3的數字放到一組,大於3的放到一組,返回Map[String,Array[Int]]

    val a = Array(1, 2, 3,4)

    val b = a.groupBy( x => x match {

      case x if (x < 3) => "small"

      case _ => "big"

    })

**************************************************************************************************************************************

-def grouped(size: Int): collection.Iterator[Array[T]]

按指定數量分組,每組有 size 數量個元素,返回一個集合

    val a = Array(1, 2, 3,4,5)

    val b = a.grouped(3).toList

    b.foreach((x) => println("第"+(b.indexOf(x)+1)+"組:"+x.mkString(",")))

    /**

    第1組:1,2,3

    第2組:4,5

    */

**************************************************************************************************************************************

-def hasDefiniteSize: Boolean

檢測序列是否存在有限的長度,對應Stream這樣的流資料,返回false

    val a = Array(1, 2, 3,4,5)

    println(a.hasDefiniteSize)  //true

**************************************************************************************************************************************

-def head: T

返回序列的第一個元素,如果序列為空,將引發錯誤

    val a = Array(1, 2, 3,4,5)

    println(a.head) //1

**************************************************************************************************************************************

-def headOption: Option[T]

返回Option型別物件,就是scala.Some 或者 None,如果序列是空,返回None

    val a = Array(1, 2, 3,4,5)

    println(a.headOption)   //Some(1)

**************************************************************************************************************************************

-def indexOf(elem: T): Int

返回elem在序列中的索引,找到第一個就返回

    val a = Array(1, 3, 2, 3, 4)

    println(a.indexOf(3))   // return 1

-def indexOf(elem: T, from: Int): Int

返回elem在序列中的索引,可以指定從某個索引處(from)開始查詢,找到第一個就返回

    val a = Array(1, 3, 2, 3, 4)

    println(a.indexOf(3,2)) // return 3

**************************************************************************************************************************************

-def indexOfSlice[B >: A](that: GenSeq[B]): Int

檢測當前序列中是否包含另一個序列(that),並返回第一個匹配出現的元素的索引

    val a = Array(1, 3, 2, 3, 4)

    val b = Array(2,3)

    println(a.indexOfSlice(b))  // return 2

**************************************************************************************************************************************

-def indexOfSlice[B >: A](that: GenSeq[B], from: Int): Int

檢測當前序列中是否包含另一個序列(that),並返回第一個匹配出現的元素的索引,指定從 from 索引處開始

    val a = Array(1, 3, 2, 3, 2, 3, 4)

    val b = Array(2,3)

    println(a.indexOfSlice(b,3))    // return 4

**************************************************************************************************************************************

-def indexWhere(p: (T) => Boolean): Int

返回當前序列中第一個滿足 p 條件的元素的索引

    val a = Array(1, 2, 3, 4)

    println(a.indexWhere( {x:Int => x>3}))  // return 3

**************************************************************************************************************************************

-def indexWhere(p: (T) => Boolean, from: Int): Int

返回當前序列中第一個滿足 p 條件的元素的索引,可以指定從 from 索引處開始

    val a = Array(1, 2, 3, 4, 5, 6)

    println(a.indexWhere( {x:Int => x>3},4))    // return 4

**************************************************************************************************************************************

-def indices: collection.immutable.Range

返回當前序列索引集合

    val a = Array(10, 2, 3, 40, 5)

    val b = a.indices

    println(b.mkString(","))    // 0,1,2,3,4

**************************************************************************************************************************************

-def init: Array[T]

返回當前序列中不包含最後一個元素的序列

    val a = Array(10, 2, 3, 40, 5)

    val b = a.init

    println(b.mkString(","))    // 10, 2, 3, 40

**************************************************************************************************************************************

-def inits: collection.Iterator[Array[T]]

對集合中的元素進行 init 操作,該操作的返回值中, 第一個值是當前序列的副本,包含當前序列所有的元素,最後一個值是空的,對頭尾之間的值進行init操作,上一步的結果作為下一步的操作物件

    val a = Array(1, 2, 3, 4, 5)

    val b = a.inits.toList

    for(i <- 1 to b.length){

      val s = "第%d個值:%s"

      println(s.format(i,b(i-1).mkString(",")))

    }

    /**計算結果

    第1個值:1,2,3,4,5

    第2個值:1,2,3,4

    第3個值:1,2,3

    第4個值:1,2

    第5個值:1

    第6個值

*/

**************************************************************************************************************************************

-def intersect(that: collection.Seq[T]): Array[T]

取兩個集合的交集

    val a = Array(1, 2, 3, 4, 5)

    val b = Array(3, 4, 6)

    val c = a.intersect(b)

    println(c.mkString(","))    //return 3,4

**************************************************************************************************************************************

-def isDefinedAt(idx: Int): Boolean

判斷序列中是否存在指定索引

    val a = Array(1, 2, 3, 4, 5)

    println(a.isDefinedAt(1))   // true

    println(a.isDefinedAt(10))  // false

**************************************************************************************************************************************

-def isEmpty: Boolean

判斷當前序列是否為空

-def isTraversableAgain: Boolean

判斷序列是否可以反覆遍歷,該方法是GenTraversableOnce中的方法,對於 Traversables 一般返回true,對於 Iterators 返回 false,除非被複寫

-def iterator: collection.Iterator[T]

對序列中的每個元素產生一個 iterator

    val a = Array(1, 2, 3, 4, 5)

    val b = a.iterator  //此時就可以通過迭代器訪問 b

**************************************************************************************************************************************

-def last: T

取得序列中最後一個元素

    val a = Array(1, 2, 3, 4, 5)

println(a.last) // return  5

**************************************************************************************************************************************

-def lastIndexOf(elem: T): Int

取得序列中最後一個等於 elem 的元素的位置

    val a = Array(1, 4, 2, 3, 4, 5)

    println(a.lastIndexOf(4))   // return  4

**************************************************************************************************************************************

-def lastIndexOf(elem: T, end: Int): Int

取得序列中最後一個等於 elem 的元素的位置,可以指定在 end 之前(包括)的元素中查詢

    val a = Array(1, 4, 2, 3, 4, 5)

    println(a.lastIndexOf(4,3)) // return  1

**************************************************************************************************************************************

-def lastIndexOfSlice[B >: A](that: GenSeq[B]): Int

判斷當前序列中是否包含序列 that,並返回最後一次出現該序列的位置處的索引

    val a = Array(1, 4, 2, 3, 4, 5, 1, 4)