第一節 Scala語言初步
本節主要內容
- Scala簡介
- 為什麼要學習Scala
- Scala語言初步
1. Scala簡介
Scala(Scala Language的簡稱)語言是一種能夠運行於JVM和.Net平臺之上的通用程式語言,既可用於大規模應用程式開發,也可用於指令碼程式設計,它由由Martin
Odersk於2001開發,2004年開始程式執行在JVM與.Net平臺之上,由於其簡潔、優雅、型別安全的程式設計模式而受到關注。
Scala的建立者——Martin Odersk
在Scala的建立之初,並沒有怎麼引起重視,隨著Apache Spark和Apache Kafka這樣基於Scala的大資料框架的崛起,Scala逐步映入大資料從業者的眼簾。Scala的擁護者們認為Scala的主要優勢是速度和它的表達性。目前使用scala的作為支撐公司開發語言的包括Foursquare和Twitter。2009年Twitter把大部分後臺系統的開發語言從Ruby換成了Scala。參見這篇文章:Twitter on Scala: A Conversation with Steve Jenson, Alex Payne, and Robey Pointer,” Scalazine, April 3,2009, www.artima.com/scalazine/articles/twitter_on_scala.html.
Scala語言具有如下特點:
1 純面向物件程式語言
- (1) Encapsulation/information hiding.
- (2)Inheritance.
- (3)Polymorphism/dynamic binding.
- (4)All predefined types are objects.
- (5) All operations are performed by sending messages to objects.
- (6)All user-defined types are objects.
2 函數語言程式設計語言
定義:Functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data.
函數語言程式設計語言應支援以下特性:
(1)高階函式(Higher-order functions)
(2)閉包( closures)
(3)模式匹配( Pattern matching)
(4)單一賦值( Single assignment )
(5)延遲計算( Lazy evaluation)
(6)型別推導( Type inference )
(7)尾部呼叫優化( Tail call optimization)
(8)型別推導( Type inference )
3 Scala語言具有很強的相容性、移植性
Scala運行於JVM上,能夠與Java進行互操作,具有與JAVA一樣的平臺移植性
4 Scala語法的簡潔
下面給的是java的Hadoop wordcount程式碼及Spark wordcount程式碼
可以看到,spark三行程式碼就解決了hadoop 七八十行程式碼做的事情。
2. 為什麼要學習Scala
1 開源大資料記憶體計算框架Spark的流行
- Spark是當前最流行的開源大資料記憶體計算框架,採用Scala語言實現,由UC 伯克利大學AMPLab實驗室開發(2009)並於2010年開源,在2014年成為Apache基金會的頂級專案http://spark.apache.org/
- Spark有著很好的效能優勢。
圖片來源:databricks.com/blog/2014/11/05/spark-officiallysets-a-new-record-in-large-scale-sorting.html -
社群活躍度
圖片來源:Real-Time Analytics with Spark Streaming
圖片來源:Spark Summit 2015
圖片來源:twitter.com/dberkholz/status/568561792751771648 -
各大公司使用與貢獻情況
圖片來源:Summit Spark 2015 https://spark-summit.org/2015/
- IBM 百萬資料工程師計劃
【2015年6月17日,北京】IBM(NYSE:IBM)宣佈承諾大力推進Apache Spark專案,並稱該專案為:在以資料為主導的,未來十年最為重要的新的開源專案。這一承諾的核心是將Spark嵌入IBM業內領先的分析和商務平臺,並將Spark作為一項服務,在IBM Bluemix平臺上提供給客戶。IBM還將投入超過3500名研究和開發人員在全球十餘個實驗室開展與Spark相關的專案,並將為Spark開源生態系統無償提供突破性的機器學習技術——IBM
SystemML,同時,IBM還將培養超過100萬名Spark資料科學家和資料工程師。原文連結:http://www.csdn.net/article/a/2015-06-18/15825412
2 Scala是未來大資料處理的主流語言
- 它是Spark框架的開發語言
-
- ”If I were to pick a language to use today other than Java, it would be Scala.” —James Gosling
詹姆斯·高斯林 Java之父
- ”If I were to pick a language to use today other than Java, it would be Scala.” —James Gosling
-
Scala具有資料處理的天然優勢(語言特點決定)
3. Scala語言初步
1 變數定義
//宣告一個val變數
//與java final關鍵字宣告的變數一樣
//一旦被賦值,便不能更改
//Scala會幫我們進行型別推斷
scala> val helloString="Hello World"
helloString: String = Hello World
//也可以進行型別指定
scala> val helloString:String="Hello World"
helloString: String = Hello World
//String其實就是java.lang.String
scala> val helloString:java.lang.String="Hello World"
helloString: String = Hello World
//不能被重新賦值,因為它是val變數
scala> helloString="Hello Crazy World"
<console>:8: error: reassignment to val
helloString="Hello Crazy World"
^
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
下面給出的延遲載入變數:
//lazy關鍵字宣告變數
//表示該變數不會馬上賦值
//而在真正被使用時才賦值
scala> lazy val helloString="Hello Crazy World"
helloString: String = <lazy>
//在真正使用時被賦值
scala> helloString
res1: String = Hello Crazy World
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
scala中也存在可變變數,即隨著程式的執行,變數內容可以動態變化:
//var 宣告可變變數
scala> var helloString="Hello Cruel World"
helloString: String = Hello Cruel World
//重新賦值
scala> helloString="GoodBye Cruel World"
helloString: String = GoodBye Cruel World
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2 函式初步
scala中通過下列方式進行函式定義:
//定義了一個函式,函式中使用return返回結果
scala> def add(a:Int,b:Int):Int={return a+b}
add: (a: Int, b: Int)Int
scala> add(1,2)
res3: Int = 3
//可以省去return,scala會將最後一個執行語句
//作為函式的返回值
scala> def add(a:Int,b:Int):Int={a+b}
add: (a: Int, b: Int)Int
//省去返回值型別,scala會自動進行型別推斷
scala> def add(a:Int,b:Int)={a+b}
add: (a: Int, b: Int)Int
scala> add(1,2)
res4: Int = 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3 HelloWorld應用程式:
package cn.xtwy.scala.chapter01
//scala應用程式同樣採用main方法作為應用程式的入口
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World")
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9