Scala与Java差异(一)之基础语法
一、Scala解釋器的使用
(1)REPL
Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循環(huán))。
scala解釋器也被稱為REPL,會(huì)快速編譯scala代碼為字節(jié)碼,然后交給JVM來(lái)執(zhí)行。
(2)計(jì)算表達(dá)式
在scala>命令行內(nèi),鍵入scala代碼,解釋器會(huì)直接返回結(jié)果給你。如果你沒(méi)有指定變量來(lái)存放這個(gè)值,那么值默認(rèn)的名稱為res,而且會(huì)顯示結(jié)果的數(shù)據(jù)類型,比如Int、Double、String等等。
例如,輸入1 + 1,會(huì)看到res0: Int = 2
(3)內(nèi)置變量
在后面可以繼續(xù)使用res這個(gè)變量,以及它存放的值。
例如,2.0 * res0,返回res1: Double = 4.0
例如,"Hi, " + res0,返回res2: String = Hi, 2
(4)自動(dòng)補(bǔ)全
在scala>命令行內(nèi),可以使用Tab鍵進(jìn)行自動(dòng)補(bǔ)全。
例如,輸入res2.to,敲擊Tab鍵,解釋器會(huì)顯示出以下選項(xiàng),toCharArray,toLowerCase,toString,toUpperCase。因?yàn)榇藭r(shí)無(wú)法判定你需要補(bǔ)全的是哪一個(gè),因此會(huì)提供給你所有的選項(xiàng)。
例如,輸入res2.toU,敲擊Tab鍵,直接會(huì)給你補(bǔ)全為res2.toUpperCase。
?
二、變量聲明
(1)聲明val變量
可以聲明val變量來(lái)存放表達(dá)式的計(jì)算結(jié)果。
例如,val result = 1 + 1
后續(xù)這些常量是可以繼續(xù)使用的,例如,2 * result
但是常量聲明后,是無(wú)法改變它的值的,例如,result = 1,會(huì)返回error: reassignment to val的錯(cuò)誤信息。
(2)聲明var變量
如果要聲明值可以改變的引用,可以使用var變量。
例如,val myresult = 1,myresult = 2
但是在scala程序中,通常建議使用val,也就是常量,因此比如類似于spark的大型復(fù)雜系統(tǒng)中,需要大量的網(wǎng)絡(luò)傳輸數(shù)據(jù),如果使用var,可能會(huì)擔(dān)心值被錯(cuò)誤的更改。
在Java的大型復(fù)雜系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā)中,也使用了類似的特性,我們通常會(huì)將傳遞給其他模塊 / 組件 / 服務(wù)的對(duì)象,設(shè)計(jì)成不可變類(Immutable Class)。在里面也會(huì)使用java的常量定義,比如final,阻止變量的值被改變。從而提高系統(tǒng)的健壯性(robust,魯棒性),和安全性。
(3)指定類型
無(wú)論聲明val變量,還是聲明var變量,都可以手動(dòng)指定其類型,如果不指定的話,scala會(huì)自動(dòng)根據(jù)值,進(jìn)行類型的推斷。
例如,val name: String = null
例如,val name: Any = "leo"
聲明多個(gè)變量:可以將多個(gè)變量放在一起進(jìn)行聲明。
例如,val name1, name2:String = null
例如,val num1, num2 = 100
?
三、數(shù)據(jù)類型與操作符
(1)基本數(shù)據(jù)類型
Byte、Char、Short、Int、Long、Float、Double、Boolean。
乍一看與Java的基本數(shù)據(jù)類型的包裝類型相同,但是scala沒(méi)有基本數(shù)據(jù)類型與包裝類型的概念,統(tǒng)一都是類。scala自己會(huì)負(fù)責(zé)基本數(shù)據(jù)類型和引用類型的轉(zhuǎn)換操作。
使用以上類型,直接就可以調(diào)用大量的函數(shù),例如,1.toString(),1.to(10)。
(2)類型的加強(qiáng)版類型
scala使用很多加強(qiáng)類給數(shù)據(jù)類型增加了上百種增強(qiáng)的功能或函數(shù)。
例如,String類通過(guò)StringOps類增強(qiáng)了大量的函數(shù),"Hello".intersect(" World")。
例如,Scala還提供了RichInt、RichDouble、RichChar等類型,RichInt就提供了to函數(shù),1.to(10),此處Int先隱式轉(zhuǎn)換為RichInt,然后再調(diào)用其to函數(shù)
(3)基本操作符
scala的算術(shù)操作符與java的算術(shù)操作符也沒(méi)有什么區(qū)別,比如+、-、*、/、%等,以及&、|、^、>>、<<等。
但是,在scala中,這些操作符其實(shí)是數(shù)據(jù)類型的函數(shù),比如1 + 1,可以寫做1.+(1)
例如,1.to(10),又可以寫做1 to 10
scala中沒(méi)有提供++、--操作符,我們只能使用+和-,比如counter = 1,counter++是錯(cuò)誤的,必須寫做counter += 1.
?
四、函數(shù)調(diào)用與apply()函數(shù)
(1)函數(shù)調(diào)用方式
在scala中,函數(shù)調(diào)用也很簡(jiǎn)單。
例如,import scala.math._,sqrt(2),pow(2, 4),min(3, Pi)。
不同的一點(diǎn)是,如果調(diào)用函數(shù)時(shí),不需要傳遞參數(shù),則scala允許調(diào)用函數(shù)時(shí)省略括號(hào)的,例如,"Hello World".distinct
(2)apply函數(shù)
Scala中的apply函數(shù)是非常特殊的一種函數(shù),在Scala的object中,可以聲明apply函數(shù)。而使用“類名()”的形式,其實(shí)就是“類名.apply()”的一種縮寫。通常使用這種方式來(lái)構(gòu)造類的對(duì)象,而不是使用“new 類名()”的方式。
例如,"Hello World"(6),因?yàn)樵赟tringOps類中有def apply(n: Int): Char的函數(shù)定義,所以"Hello World"(6),實(shí)際上是"Hello World".apply(6)的縮寫。
例如,Array(1, 2, 3, 4),實(shí)際上是用Array object的apply()函數(shù)來(lái)創(chuàng)建Array類的實(shí)例,也就是一個(gè)數(shù)組。
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Scala与Java差异(一)之基础语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机主板上的CMOS是什么主板CMOS
- 下一篇: Scala与Java差异(二)之条件控制