1. 程式人生 > >第一節 Scala語言初步

第一節 Scala語言初步

本節主要內容

  1. Scala簡介
  2. 為什麼要學習Scala
  3. 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之父
  • 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