柚子快報(bào)激活碼778899分享:后端 Scala的基礎(chǔ)
柚子快報(bào)激活碼778899分享:后端 Scala的基礎(chǔ)
目錄
1.什么是Scala
2.安裝Scala
3.Scala基礎(chǔ)
4.數(shù)據(jù)類型
5.方法與函數(shù)
5.1.方法的定義使用def關(guān)鍵字,語法:
5.2.函數(shù)
6.抽象類和特質(zhì)
1.什么是Scala
????????Scala是一種將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合在一起的高級語言,設(shè)計(jì)初衷是要集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特性,旨在以簡潔、優(yōu)雅和類型安全的方式表達(dá)通用編程模式。Scala功能強(qiáng)大,不僅可以編寫簡單腳本,還可以構(gòu)建大型系統(tǒng)。
????????由于Spark主要是由Scala語言編寫的,為了后續(xù)更好的學(xué)習(xí)Spark以及使用Scala編寫Spark應(yīng)用程序,需要首先學(xué)習(xí)使用Scala語言。
2.安裝Scala
????????由于Scala運(yùn)行于Java平臺,因此安裝Scala之前需要確保系統(tǒng)安裝了JDK。此處使用的Scala版本為2.12.7,要求JDK版本為1.8。
Scala 依賴 jdk,jdk 下載:Java Downloads | Oracle
Sclal下載:https://www.scala-sbt.org/download.html
解壓到指定目錄:
$ tar -zxvf scala-2.12.7.tgz -C /opt/modules/
配置環(huán)境變量:?
export SCALA_HOME=/opt/modules/scala-2.12.7/
export PATH=$PATH:$SCALA_HOME/bin
3.Scala基礎(chǔ)
????????最初學(xué)習(xí)Scala的時(shí)候建議在Scala命令行模式中操作,最終程序的編寫可以在IDE中進(jìn)行。在Windows CMD窗口中或CentOS的Shell命令中執(zhí)行“scala”命令,即可進(jìn)入Scala的命令行操作模式。
4.數(shù)據(jù)類型
????????Any是Scala類層次結(jié)構(gòu)的根,也被稱為超類或頂級類。Scala執(zhí)行環(huán)境中的每個(gè)類都直接或間接地從該類繼承。該類中定義了一些通用的方法,例如equals()、hashCode()和toString()。Any有兩個(gè)直接子類:AnyVal和AnyRef。 AnyVal表示值類型。有9種預(yù)定義的值類型,它們是非空的Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一個(gè)不包含任何信息的值類型,和Java語言中的void等同,用作不返回任何結(jié)果的方法的結(jié)果類型。Unit只有一個(gè)實(shí)例值,寫成()。 AnyRef表示引用類型。所有非值類型都被定義為引用類型。Scala中的每個(gè)用戶定義類型都是AnyRef的子類型。AnyRef對應(yīng)于Java中的Java.lang.Object。 Nothing是所有類型的子類,在Scala類層級的最低端。Nothing沒有對象,因此沒有具體值,但是可以用來定義一個(gè)空類型,類似于Java中的標(biāo)示性接口(如:Serializable,用來標(biāo)識該類可以進(jìn)行序列化)。舉個(gè)例子,如果一個(gè)方法拋出異常,則異常的返回值類型就是Nothing(雖然不會返回)。 Null是所有引用類型(AnyRef)的子類,所以Null可以賦值給所有的引用類型,但不能賦值給值類型,這個(gè)和Java的語義是相同的。Null有一個(gè)唯一的單例值null。
5.方法與函數(shù)
Scala中有方法與函數(shù)。Scala 方法是類或?qū)ο笾卸x的成員,而函數(shù)是一個(gè)對象,可以將函數(shù)賦值給一個(gè)變量。換句話說,方法是函數(shù)的特殊形式。
5.1.方法的定義使用def關(guān)鍵字,語法:
def 方法名 (參數(shù)列表):返回類型={
方法體
}
例如,將兩個(gè)數(shù)字求和然后返回,返回類型為Int:
def addNum( a:Int, b:Int ) : Int = {
var sum = 0
sum = a + b
return sum
}
代碼簡寫,去掉返回類型和return關(guān)鍵字:
def addNum( a:Int, b:Int ) = {
var sum = 0
sum = a + b
sum
如果方法沒有返回結(jié)果,可以將返回類型設(shè)置為Unit,類似Java中的void:
def addNum( a:Int, b:Int ) : Unit = {
var sum = 0
sum = a + b
println(sum)
}
在定義方法參數(shù)時(shí),可以為某個(gè)參數(shù)指定默認(rèn)值,在方法被調(diào)用時(shí)可以不為帶有默認(rèn)值的參數(shù)傳入實(shí)參:
def addNum( a:Int=5, b:Int ) = {
var sum = 0
sum = a + b
sum
}
5.2.函數(shù)
函數(shù)的定義與方法不一樣,語法:
(參數(shù)列表)=>函數(shù)體
定義一個(gè)匿名函數(shù),參數(shù)為a和b,且都是Int類型,函數(shù)體為a+b:
( a:Int, b:Int ) =>a+b
如果函數(shù)體有多行,可以將函數(shù)體放入一對{}中,并且可以通過一個(gè)變量來引用函數(shù),變量相當(dāng)于函數(shù)名稱:
val f1=( a:Int, b:Int ) =>{ a+b }
對上述函數(shù)進(jìn)行調(diào)用:
f1(1,2)
函數(shù)也可以沒有參數(shù):
val f2=( ) =>println("hello scala")
對上述函數(shù)進(jìn)行調(diào)用:
f2()
定義一個(gè)方法m1,參數(shù)f要求是一個(gè)函數(shù),該函數(shù)有兩個(gè)Int類型參數(shù),且函數(shù)的返回類型為Int,方法體中直接調(diào)用該函數(shù):
def m1(f: (Int, Int) => Int): Int = {
f(2, 6)
}
定義一個(gè)函數(shù)f1:
val f1 = (x: Int, y: Int) => x + y
調(diào)用方法m1,并傳入函數(shù)f1:
val res = m1(f1)
println(res)
輸出結(jié)果為8。
當(dāng)把一個(gè)方法作為參數(shù)傳遞給其它的方法或者函數(shù)時(shí),系統(tǒng)將自動將該方法轉(zhuǎn)換為函數(shù)。
例如,有一個(gè)方法m2:
def m2(x:Int,y:Int) = x+y
調(diào)用(2)中的m1方法,并將m2作為參數(shù)傳入,此時(shí)系統(tǒng)會自動將m2方法轉(zhuǎn)為函數(shù):
val res = m1(m2)
println(res)
輸出結(jié)果為8。
除了系統(tǒng)自動轉(zhuǎn)換外,也可以手動進(jìn)行轉(zhuǎn)換。在方法名稱后加入一個(gè)空格和一個(gè)下劃線,即可將方法轉(zhuǎn)換為函數(shù):
val f2=m2 _
val res=m1(f2)
println(res)
輸出結(jié)果為8。
6.抽象類和特質(zhì)
Scala的抽象類使用關(guān)鍵字abstract定義,具有以下特征:
抽象類不能被實(shí)例化。抽象類中可以定義抽象字段(沒有初始化的字段)和抽象方法(沒有被實(shí)現(xiàn)的方法),也可以定義被初始化的字段和被實(shí)現(xiàn)的方法。若某個(gè)子類繼承了一個(gè)抽象類,則必須實(shí)現(xiàn)抽象類中的抽象字段和抽象方法。且實(shí)現(xiàn)的過程中可以添加override關(guān)鍵字也可以省略。若重寫了抽象類中已經(jīng)實(shí)現(xiàn)的方法,則必須添加override關(guān)鍵字。
定義一個(gè)抽象類Person:
abstract class Person {
var name:String //抽象字段
var age:Int
var address:String="北京" //普通字段
def speak() //抽象方法
def eat():Unit={ //普通方法
println("吃東西")
}
}
定義一個(gè)普通類Teacher,并繼承抽象類Person,實(shí)現(xiàn)Person中的抽象字段和抽象方法,并重寫方法eat():
//繼承了抽象類Person
class Teacher extends Person{
//實(shí)現(xiàn)抽象字段
var name: String = "王麗"
var age: Int = 28
//實(shí)現(xiàn)抽象方法
def speak(): Unit = {
println("姓名:"+this.name)
println("年齡:"+this.age)
println("地址:"+this.address)//繼承而來
println("擅長講課")
}
//重寫非抽象方法,必須添加override關(guān)鍵字
override def eat():Unit={
println("愛吃中餐")
}
}
Scala特質(zhì)使用關(guān)鍵字trait定義,類似Java中使用interface定義的接口。特質(zhì)除了有Java接口的功能外,還有一些特殊的功能。
定義了一個(gè)特質(zhì)Pet:
//定義特質(zhì)(寵物)
trait Pet {
var name:String //抽象字段
var age:Int
def run //抽象方法
def eat: Unit ={ //非抽象方法
println("吃東西")
}
}
定義一個(gè)普通類Cat,實(shí)現(xiàn)了上述特質(zhì)Pet(必須實(shí)現(xiàn)未實(shí)現(xiàn)的字段和方法):
class Cat extends Pet
var name:String="john" { //實(shí)現(xiàn)抽象字段
var age:Int=3
def run: Unit = {//實(shí)現(xiàn)抽象方法
println("會跑")
}
override def eat: Unit ={ //重寫非抽象方法
println("吃魚")
}
}
若需要實(shí)現(xiàn)多個(gè)特質(zhì),可以通過with關(guān)鍵字添加額外特質(zhì),但位于最左側(cè)的特質(zhì)必須使用extends關(guān)鍵字:
trait Animal{
}
trait Runable{
}
//類Dog實(shí)現(xiàn)了三個(gè)特質(zhì)
class Dog extends Pet with Animal with Runable{
柚子快報(bào)激活碼778899分享:后端 Scala的基礎(chǔ)
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。