Scala語法彙集ABC

Scala ABC

https://docs.scala-lang.org/tour/tour-of-scala.html
http://www.runoob.com/scala/scala-tutorial.html

Array

存儲固定大小的同類型元素。 mutable。
Array._ 包提供了很多實用的數組方法:apply, concat, range, etc.

import Array._ 
scala> var arr = Array(1, 2, 3)
arr: Array[Int] = Array(1, 2, 3)

scala> for (i <- arr) {println(i)}
1
2
3

scala> for (i <- arr) println(i)
1
2
3

scala> var arr2 = Array(4, 5, 6)
arr2: Array[Int] = Array(4, 5, 6)

scala> var myList1 = range(10, 20, 2)
myList1: Array[Int] = Array(10, 12, 14, 16, 18)

Collection: List, tuple, Map, Set, Iterator

  • list immutable
// 構建
scala> var li = List(1,2)
li: List[Int] = List(1, 2)

scala> var tu = (1, 2, 'hh')	// scala 字符串 ""
<console>:1: error: unclosed character literal
var tu = (1, 2, 'hh')                   ^

scala> var tu = (1, 2, "hh")	//元祖元素可不同類型
tu: (Int, Int, String) = (1,2,hh)

scala> var li = 1::2::3
<console>:13: error: value :: is not a member of Int
       var li = 1::2::3
                    ^

scala> var li = 1::2::Nil		// Nil 視爲空list
li: List[Int] = List(1, 2)

scala> var li = 1::2::"hh"::Nil
li: List[Any] = List(1, 2, hh)

// 前後連接
scala> 0 +: li
res7: List[Any] = List(0, 1, 2, hh)

scala> li :+ 3
res9: List[Any] = List(1, 2, hh, 3)

// index 獲取元素
scala> li(2)
res5: Any = hh

scala> li.apply(2)
res10: Any = hh

scala> tu._1
res6: Int = 1

// 其他方法
scala> li.contains("hh")
res11: Boolean = true

scala> li.exists(s => s == "hh")
res13: Boolean = true


scala> val li = List(1,2,3)
li: List[Int] = List(1, 2, 3)

scala> li.filter(x => x>1)
res14: List[Int] = List(2, 3)

scala> li.map(x => x+1)
res15: List[Int] = List(2, 3, 4)

scala> li.reduce((x, y) => x+y)
res16: Int = 6

scala> li
res17: List[Int] = List(1, 2, 3)

scala> li.foreach(print)
123
scala> li.forall(x => x>0)
res19: Boolean = true

scala> li.drop(2)
res20: List[Int] = List(3)

scala> li
res21: List[Int] = List(1, 2, 3)

scala> li.dropRight(2)
res22: List[Int] = List(1)

scala> li.take(2)
res23: List[Int] = List(1, 2)

scala> li.takeRight(2)
res24: List[Int] = List(2, 3)

scala> li.dropWhile(x => x>1)
res25: List[Int] = List(1, 2, 3)

scala> li.mkString
res26: String = 123

scala> li.toString()
res27: String = List(1, 2, 3)

scala> li.toArray
res28: Array[Int] = Array(1, 2, 3)

scala> li
res29: List[Int] = List(1, 2, 3)
// 一個 SEQ 是一個具有已定義元素順序的Iterable。序列提供了一種方法 apply() 用於索引,範圍從0到序列的長度。 Seq有許多子類,包括Queue,Range,List,Stack和LinkedList。
// 參考http://landcareweb.com/images/861/2fjoA.png
scala> li.toSeq
res30: scala.collection.immutable.Seq[Int] = List(1, 2, 3)

scala> li.toSet
res31: scala.collection.immutable.Set[Int] = Set(1, 2, 3)


Scala 基礎示例

三點: scala 交互式命令示例、OOP編程示例 和 Scala函數示例

Spark-shell scala 交互式命令行

$ scala
// $ $SPARK_HOME/bin/spark-shell

scala> print(1+2) // 3

scala> val books = List("Hadoop","Hive","HDFS")   // books: List[String] = List(Hadoop, Hive, HDFS)
// Map 映射
scala> book.map(s => (s, 1))    //元組,可含不同數據類型: List[(String, Int)] = List((Hadoop,1), (Hive,1), (HDFS,1))
// flatMap “拍扁式”映射
scala> books.flatMap(s => s.toList)        // List[Char] = List(H, a, o, o, p, H, i, v, e, H, D, F, S)
// filter
scala> books.filter(s => s.contains("doop"))    //List[String] = List(Hadoop)
scala> books.books.filter(_.contains("doop"))
// reduce
scala> books.reduce( (x,y) => {print(x,y); x+y} ) // (Hadoop,Hive) (HadoopHive,HDFS)res4: String = HadoopHiveHDFS
scala> books.reduce(_ + _)
// reduceLeft 同 reduce
scala> books.reduceLeft( (x,y) => {print(x,y); x+y} )  // (Hadoop,Hive)(HadoopHive,HDFS)res5: String = HadoopHiveHDFS
// reduceRight
scala> books.reduceRight( (x,y) => {print(x,y); x+y} )  //(Hive,HDFS)(Hadoop,HiveHDFS)res6: String = HadoopHiveHDFS

Scala OOP示例

  • 方法:
// Method:
def methodName[parameter list][: return type] [= {method body}]

// parameter list: param1: type1, param2: type2..., parameter list can be empty.
def emptyMethod = {2}, then emptyMethod: Int, auto-inference.
def m(a: Int):Int = {return 2}, then m: (a: Int)Int, or def m(a: Int) = {2}.

// method body 方法體可以爲語句statements或表達式expresssion或二者結合,其中表達式只有最後一個生效。
def m(a: Int) = {var b = a*2; b*3; b*4}	// m(1) == 8, 1*2*4

// Currying
def adderMethodCurry(x: Int)(y: Int) = {x + y}
adderMethodCurry(1)_ // Int => Int = <function1>
adderMethodCurry(1)(2) // 3
```scala

- 類構造器在類聲明的參數列表可見
```bash
// 類構造器在類聲明的參數列表可見
// val only getter, var getter and setter, Add private both no.
scala> class Person(var name: String)
defined class Person

scala> val p = new Person("Hansey")
p: Person = Person@ca31fc

scala> p.name
res0: String = Hansey


// case class 樣例類一般用來描述不可變的對象,多用作模式匹配。構造器會默認參數val ,除非顯式更改
scala> case class Person(var name: String)
defined class Person

scala> val p = Person("CaseClass-Hansey")
p: Person = Person(CaseClass-Hansey)

scala> p.name
res1: String = CaseClass-Hansey


  • 示例
package com.test

// Trait, or Interface, similar to abstract class in java
trait Equal {
  def isEqual(x: Any): Boolean    // abstract method
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

class Point(xc: Int, yc: Int) extends Equal {
  // constructor
  var x = xc
  var y = yc

  // Method:
  // def methodName[parameter list][: return type] [= {method body}]
  // parameter list: param1: type1, param2: type2..., parameter list can be empty.
  // def emptyMethod = {2}, then emptyMethod: Int, auto-inference.
  // def m(a: Int):Int = {return 2}, then m: (a: Int)Int, or def m(a: Int) = {2}.


  def move(dx: Int, dy: Int) = {
    x += dx
    y += dy
  }
  // Implement trait abstract method
  def isEqual(obj: Any): Boolean = {
    obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x && obj.asInstanceOf[Point].y == y
  }
  // Override Non-abstract method in the Any Class
  override def toString= "point x: %d, y: %d ".format(x, y)
}


class Location(xc: Int, yc: Int, zc: Int) extends Point(xc, yc){
  var z: Int = zc

  // override, same name and same args
  override def move(dx: Int, dy: Int): Unit = {
    x += 2*dx
    y += 2*dy
  }
  def move(dx: Int, dy: Int, dz: Int) =  {
    super.move(dx, dy)
    z = z + dz
  }
  override def toString= "location x: %d, y: %d , z: %d ".format(x, y, z)
}

object pointRun{
  def main(args: Array[String]): Unit ={
    println("---------Test OOP point-------------")
    val pt = new Point(1,1)
    pt.move(2,2)
    println("point pt: ", pt)

    val lo = new Location(1, 1, 1)
    lo.move(1,1)
    lo.move(1,1,1)
    println("location lo: ", lo)

    val loFinal = new Location(4, 4, 2)
    println("location Final loFinal: ", loFinal)
    printf("lo.isEqual(loFinal): %s \n", lo.isEqual(loFinal))
  }
}

Scala 函數示例

  • 函數
// Function
// val funcName[: (function type)] = (parameter list) => {function body}
// val funcName[: (function type)] = lambda expression
val adder: (Int, Int) => (Int) = (x: Int, y: Int) => {x + y}

// function body 函數體只能爲表達式(不能有如var a = b等賦值語句,不能顯式return等),其中表達式只有最後一個生效。花括號可省略。
val f = (a: Int) => {a*2; a*3} // f(1) == 3, a*3

// parameter list can be empty
val noParamFun = () => 2
  • 示例
package com.test

object funcs {
  // Function
  // val funcName[: (function type)] = (parameter list) => {function body}, parameter list can be empty.
  // val funcName[: (function type)] = lambda expression
  val adder: (Int, Int) => (Int) = (x: Int, y: Int) => x + y

  // Auto type inference
  // val adder: (Int, Int) => (Int) = (x, y) => x + y
  // val adder = (x: Int, y: Int) => x + y


  // Currying: Transfer a multi-args function to a chain of function in which every function has only one parameter
  val adderFuncCurry = (x: Int) => (y: Int) => x + y

  def adderMethodCurry(x: Int)(y: Int) = {
    x + y
  }

  def run() ={
    print("---------Test functions-------------")
    println("adder(100, 1): ", adder(100, 1))   // 101

    println("adderFuncCurry(100)(1): ", adderFuncCurry(100)(1))  // 101

    val addBase100 = adderFuncCurry(100)
    println("addBase100(1): ", addBase100(1)) // 101

    println("adderMethodCurry(100)(1): ", adderMethodCurry(100)(1))
  }
}

<全文完>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章