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))
}
}
<全文完>