柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 后端 Scala基礎(chǔ)
柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 后端 Scala基礎(chǔ)
Scala基礎(chǔ)
文章目錄
Scala基礎(chǔ)前言Scala是一種將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合在一起的高級(jí)語(yǔ)言,旨在以簡(jiǎn)潔、優(yōu)雅和類型安全的方式表達(dá)通用編程模式。Scala功能強(qiáng)大,不僅可以編寫簡(jiǎn)單腳本,還可以構(gòu)建大型系統(tǒng)。Scala運(yùn)行于Java平臺(tái),Scala程序會(huì)通過JVM被編譯成class字節(jié)碼文件,然后在操作系統(tǒng)上運(yùn)行。其運(yùn)行時(shí)候的性能通常與Java程序不分上下,并且Scala代碼可以調(diào)用Java方法、繼承Java類、實(shí)現(xiàn)Java接口等,幾乎所有Scala代碼都大量使用了Java類庫(kù)。
一、CentOs安裝Scala二、Scala基礎(chǔ)1.變量聲明2.表達(dá)式3.循環(huán)4.方法與函數(shù)5.集合、數(shù)組、List、Map映射、元組、Set6.類和對(duì)象
前言
Scala是一種將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合在一起的高級(jí)語(yǔ)言,旨在以簡(jiǎn)潔、優(yōu)雅和類型安全的方式表達(dá)通用編程模式。Scala功能強(qiáng)大,不僅可以編寫簡(jiǎn)單腳本,還可以構(gòu)建大型系統(tǒng)。Scala運(yùn)行于Java平臺(tái),Scala程序會(huì)通過JVM被編譯成class字節(jié)碼文件,然后在操作系統(tǒng)上運(yùn)行。其運(yùn)行時(shí)候的性能通常與Java程序不分上下,并且Scala代碼可以調(diào)用Java方法、繼承Java類、實(shí)現(xiàn)Java接口等,幾乎所有Scala代碼都大量使用了Java類庫(kù)。
一、CentOs安裝Scala
1、下載Scala 到Scala官網(wǎng)https://www.scala-lang.org/download/下載Linux安裝包scala-2.12.7.tgz
解壓到指定目錄: $ tar -zxvf scala-2.12.7.tgz -C /opt/modules/
2、配置環(huán)境變量 export SCALA_HOME=/opt/modules/scala-2.12.7/ export PATH=
P
A
T
H
:
PATH:
PATH:SCALA_HOME/bin
3、測(cè)試 CMD中執(zhí)行scala -version命令
二、Scala基礎(chǔ)
1.變量聲明
Scala中變量的聲明使用關(guān)鍵字val和var。
聲明一個(gè)val字符串變量str:
scala> val str="hello scala"
str: String = hello scala
聲明變量時(shí)指定數(shù)據(jù)類型:
scala> val str:String="hello scala"
str: String = hello scala
將多個(gè)變量放在一起進(jìn)行聲明:
scala> val x,y="hello scala"
x: String = hello scala
y: String = hello scala
2.表達(dá)式
Scala中常用的表達(dá)式主要有條件表達(dá)式和塊表達(dá)式。
1、條件表達(dá)式
條件表達(dá)式主要是含有if/else的語(yǔ)句塊:
scala> val i=1
i: Int = 1
scala> val result=if(i>0) 100 else -100
result: Int = 100
也可以在一個(gè)表達(dá)式中進(jìn)行多次判斷:
scala> val result=if(i>0) 100 else if(i==0) 50 else 10
result: Int = 100
3.循環(huán)
Scala中的循環(huán)主要有for循環(huán)、while循環(huán)和do while循環(huán)三種。 1、for循環(huán)
for循環(huán)的語(yǔ)法:
for(變量<-集合或數(shù)組){
方法體
}
2、while循環(huán)
while循環(huán)的語(yǔ)法:
while(條件)
{
循環(huán)體
}
3、do while循環(huán)
do while 循環(huán)與while循環(huán)類似,但是do while循環(huán)會(huì)確保至少執(zhí)行一次循環(huán)。語(yǔ)法:
do {
循環(huán)體
} while(條件)
4.方法與函數(shù)
Scala中有方法與函數(shù)。Scala 方法是類或?qū)ο笾卸x的成員,而函數(shù)是一個(gè)對(duì)象,可以將函數(shù)賦值給一個(gè)變量。換句話說,方法是函數(shù)的特殊形式。 1、方法 方法的定義使用def關(guān)鍵字,語(yǔ)法:
def 方法名 (參數(shù)列表):返回類型={
方法體
}
2、函數(shù) 函數(shù)的定義與方法不一樣,語(yǔ)法:
(參數(shù)列表)=>函數(shù)體
定義一個(gè)匿名函數(shù),參數(shù)為a和b,且都是Int類型,函數(shù)體為a+b:
( a:Int, b:Int ) =>a+b
如果函數(shù)體有多行,可以將函數(shù)體放入一對(duì){}中,并且可以通過一個(gè)變量來引用函數(shù),變量相當(dāng)于函數(shù)名稱:
val f1=( a:Int, b:Int ) =>{ a+b }
對(duì)上述函數(shù)進(jìn)行調(diào)用:
f1(1,2)
函數(shù)也可以沒有參數(shù):
val f2=( ) =>println("hello scala")
對(duì)上述函數(shù)進(jìn)行調(diào)用:
f2()
3、方法與函數(shù)的區(qū)別 (1)方法是類的一部分,而函數(shù)是一個(gè)對(duì)象并且可以賦值給一個(gè)變量。 (2)函數(shù)可以作為參數(shù)傳入到方法中。 (3)方法可以轉(zhuǎn)換為函數(shù) 當(dāng)把一個(gè)方法作為參數(shù)傳遞給其它的方法或者函數(shù)時(shí),系統(tǒng)將自動(dòng)將該方法轉(zhuǎn)換為函數(shù)。
5.集合、數(shù)組、List、Map映射、元組、Set
Scala集合分為可變集合和不可變集合。可變集合可以對(duì)其中的元素進(jìn)行修改、添加、移除;而不可變集合,永遠(yuǎn)不會(huì)改變,但是仍然可以模擬添加、移除或更新操作。這些操作都會(huì)返回一個(gè)新的集合,原集合的內(nèi)容不發(fā)生改變。 Scala中的數(shù)組分為定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組,定長(zhǎng)數(shù)組初始化后不可對(duì)數(shù)組長(zhǎng)度進(jìn)行修改,而變長(zhǎng)數(shù)組則可以修改 Scala中的List分為可變List和不可變List,默認(rèn)使用的List為不可變List。不可變List也可以增加元素,但實(shí)際上生成了一個(gè)新的List,原List不變。 Scala中的Map也分可變的Map和不可變的Map,默認(rèn)為不可變Map。 1、不可變Map 創(chuàng)建一個(gè)不可變Map: val mp = Map(
"key1" -> "value1",
"key2" -> "value2",
"key3" -> "value3"
)
也可以使用以下寫法: val mp = Map(
("key1" , "value1"),
("key2" , "value2"),
("key3" , "value3")
)
2、可變Map 創(chuàng)建可變Map需要引入類scala.collection.mutable.Map,創(chuàng)建方式與不可變Map相同。訪問Map中key1的值,代碼:
val mp = Map(
("key1" , "value1"),
("key2" , "value2")
)
元組是一個(gè)可以存放不同類型對(duì)象的集合,元組中的元素不可以修改。 Set集合存儲(chǔ)的對(duì)象不可重復(fù)。Set集合分為可變集合和不可變集合,默認(rèn)情況下使用的是不可變集合,如果要使用可變集合,則需要引用 scala.collection.mutable.Set 包。
6.類和對(duì)象
1、類的定義 對(duì)象是類的具體實(shí)例,類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。Scala中一個(gè)最簡(jiǎn)單的類定義是使用關(guān)鍵字class,類名必須大寫。類中的方法用關(guān)鍵字def定義,代碼:
class User{
private var age=20
def count(){
age+=1
}
}
如果一個(gè)類不寫訪問修飾符,則默認(rèn)訪問級(jí)別為Public。這與Java是不一樣的。關(guān)鍵字new用于創(chuàng)建類的實(shí)例。例如,調(diào)用上述代碼中的count()方法: new User().count() 2、單例對(duì)象 Scala中沒有靜態(tài)方法或靜態(tài)字段,但是可以使用關(guān)鍵字object定義一個(gè)單例對(duì)象,單例對(duì)象中的方法相當(dāng)于Java中的靜態(tài)方法,可以直接使用“單例對(duì)象名.方法名”方式進(jìn)行調(diào)用。單例對(duì)象除了沒有構(gòu)造器參數(shù)外,可以擁有類的所有特性。
例如,定義一個(gè)單例對(duì)象Person,該對(duì)象中定義了一個(gè)方法showInfo():
object Person{
private var name="zhangsan"
private var age=20
def showInfo():Unit={
println("姓名:"+name+",年齡:"+age)
}
}
可以在任何類或?qū)ο笾惺褂么aPerson.showInfo()對(duì)方法showInfo()進(jìn)行調(diào)用。 3、伴生對(duì)象 當(dāng)單例對(duì)象的名稱與某個(gè)類的名稱一樣時(shí),該對(duì)象被稱為這個(gè)類的伴生對(duì)象。類被稱為該對(duì)象的伴生類。類和它的伴生對(duì)象必須定義在同一個(gè)文件中,且兩者可以互相訪問其私有成員。例如以下代碼:
class Person() {
private var name="zhangsan"
def showInfo(){
println("年齡:"+Person.age) //訪問伴生對(duì)象的私有成員
}
}
object Person{
private var age=20
def main(args: Array[String]): Unit = {
var per=new Person()
println("姓名:"+per.name) //訪問伴生類的私有成員
per.showInfo()
}
}
4、get和set方法 Scala默認(rèn)會(huì)根據(jù)類的屬性的修飾符生成不同的get和set方法,生成原則: val修飾的屬性,系統(tǒng)會(huì)自動(dòng)生成一個(gè)私有常量屬性和一個(gè)公有g(shù)et方法。 var修飾的屬性,系統(tǒng)會(huì)自動(dòng)生成一個(gè)私有變量和一對(duì)公有g(shù)et/set方法。 private var修飾的屬性,系統(tǒng)會(huì)自動(dòng)生成一對(duì)私有g(shù)et/set方法,相當(dāng)于類的私有屬性,只能在類的內(nèi)部和伴生對(duì)象中使用。 private[this]修飾的屬性,系統(tǒng)不會(huì)生成get/set方法,即只能在類的內(nèi)部使用該屬性。
在Scala中,get和set方法并非被命名為getName和setName,而是被命名為name和name_=,由于JVM不允許在方法名中出現(xiàn)=,因此=被翻譯成$eq。
private String name = "zhangsan";
public String name() {
return this.name;
}
public void name_$eq(String x$1) {
this.name = x$1;
}
4、get和set方法 除了系統(tǒng)自動(dòng)生成get和set方法外,也可以手動(dòng)進(jìn)行編寫:
class Person {
//聲明私有變量
private var privateName="zhangsan"
def name=privateName //定義get方法
def name_=(name:String): Unit ={ //定義set方法
this.privateName=name
}
}
object Test{
def main(args: Array[String]): Unit = {
var per:Person=new Person()
//訪問變量
per.name="lisi“ //修改
println(per.name) //讀取
}
}
5、構(gòu)造器 Scala中的構(gòu)造器分為主構(gòu)造器和輔助構(gòu)造器。 主構(gòu)造器的參數(shù)直接放在類名之后,且將被編譯為類的成員變量,其值由初始化類時(shí)進(jìn)行傳入: //定義主構(gòu)造器,年齡age默認(rèn)為18
class Person(val name:String,var age:Int=18) {
}
object Person{
def main(args: Array[String]): Unit = {
//調(diào)用構(gòu)造器并設(shè)置name和age字段
var per=new Person("zhangsan",20)
println(per.age)
println(per.name)
per.name="lisi"http://錯(cuò)誤,val修飾的變量不可修改
}
}
將參數(shù)age設(shè)置為私有的,參數(shù)name設(shè)置為不可修改(val):
class Person(val name:String, private var age:Int) {
}
5、構(gòu)造器 構(gòu)造參數(shù)也可以不帶val或var,此時(shí)默認(rèn)為private[this] val: class Person(name:String,age:Int) { } 如果需要將整個(gè)主構(gòu)造器設(shè)置為私有的,只需要添加private關(guān)鍵字即可: class Person private(var name:String,var age:Int) { }
除了可以有主構(gòu)造器外,還可以有任意多個(gè)輔助構(gòu)造器。輔助構(gòu)造器的定義需要注意以下幾項(xiàng): (1)輔助構(gòu)造器的方法名稱為this。 (2)每一個(gè)輔助構(gòu)造器的方法體中必須首先調(diào)用其它已定義的構(gòu)造器。 (3)輔助構(gòu)造器的參數(shù)不能使用var或val進(jìn)行修飾。 5、構(gòu)造器 定義兩個(gè)輔助構(gòu)造器:
class Person {
private var name="zhangsan"
private var age=20
//定義輔助構(gòu)造器一
def this(name:String){
this()//調(diào)用主構(gòu)造器
this.name=name
}
//定義輔助構(gòu)造器二
def this(name:String,age:Int){
this(name)//調(diào)用輔助構(gòu)造器一
this.age=age
}
}
上述構(gòu)造器可以使用如下三種方式進(jìn)行調(diào)用:
var per1=new Person//調(diào)用無參主構(gòu)造器
var per2=new Person("lisi")//調(diào)用輔助構(gòu)造器一
var per3=new Person("lisi",28)//調(diào)用輔助構(gòu)造器二
柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 后端 Scala基礎(chǔ)
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。