柚子快報(bào)激活碼778899分享:Scala
柚子快報(bào)激活碼778899分享:Scala
Scala用法總結(jié)
一、什么是scala
spark新一代內(nèi)存級(jí)大數(shù)據(jù)計(jì)算框架,是大數(shù)據(jù)的核心內(nèi)容。
在對(duì) spark 進(jìn)行二次開(kāi)發(fā)時(shí),由于 Spark 是基于 Scala 基礎(chǔ)之上編寫(xiě)的,故而為更好地學(xué)習(xí) Spark,需要Scala 此門(mén)語(yǔ)言與掌握 spark框架的源代碼。
Scala 是 Scalable Language 的簡(jiǎn)寫(xiě),含義為可升級(jí)、可攀登,是一門(mén)多范式的編程語(yǔ)言(面向?qū)ο螅好钍骄幊痰囊环N方式/函數(shù)式編程),函數(shù)的地位得到提升,其運(yùn)用十分到位。
總的來(lái)說(shuō)就是在對(duì)spark進(jìn)行二次開(kāi)發(fā)時(shí)java學(xué)的不太好的朋友可以用scale這門(mén)更加方便的語(yǔ)言進(jìn)行操作。
(個(gè)人認(rèn)為這個(gè)語(yǔ)言對(duì)學(xué)過(guò)java的并不太友好,很接近java,但是又與java不一樣)
(果然學(xué)了python以后覺(jué)得其他語(yǔ)言都很不友好)
二、安裝
1、軟件安裝
解壓安裝包到自定義目錄下
添加環(huán)境變量
2、插件安裝
常做開(kāi)發(fā)的兄弟大多喜歡用idea的產(chǎn)品,那么問(wèn)題來(lái)了scala是否可以使用IJ進(jìn)行開(kāi)發(fā)呢?其實(shí)也不是不行,就是需要安裝對(duì)應(yīng)的插件。
打開(kāi)IJ
File——>Setting——>Plugins 然后搜索scala點(diǎn)擊 install 安裝,點(diǎn)擊OK,apply
2.1 安裝maven
在官網(wǎng)下載maven包并解壓到自定義目錄下
配置環(huán)境變量
在path中添加maven_path
修改配置
D:\Program Files\apache-maven-3.2.2\conf\settings.xml
55行左右配置本地倉(cāng)庫(kù)路徑
158行附近配置中央倉(cāng)庫(kù)鏡像源(這里配置的是阿里云的鏡像)
2.2 idea配置
筆者使用的時(shí)2023版本的IJ,還記得上次使用的時(shí)2016版本的,與之前比完全不一樣了搗鼓大半天才把環(huán)境配置好。本章節(jié)屬于事后總結(jié),不對(duì)的地方歡迎指正補(bǔ)充。
配置maven
File——>Setting 然后搜索maven進(jìn)行如下配置 (記得所有的配置需要先點(diǎn)擊apply再點(diǎn)擊OK)
配置scala
File——>Project Structures
創(chuàng)建maven項(xiàng)目,然后選中main然后右鍵 Source,Apply,OK。此時(shí)文件夾的顏色發(fā)生變化。
回到工作空間下選中創(chuàng)建的maven項(xiàng)目,然后雙擊shift,搜索 Add Framework Support
點(diǎn)擊進(jìn)入后,勾選添加scala。
至此配置應(yīng)該就結(jié)束了。
三、基本語(yǔ)法
1、helloword
創(chuàng)建scala class 選擇 object,編寫(xiě)并執(zhí)行如下程序
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
println("hello scala")
System.out.println("hello scala java")
}
}
scala在線查看幫助手冊(cè):https://www.scala-lang.org/
選擇對(duì)應(yīng)的版本進(jìn)行下載(都是英文的湊合看吧)
2、變量定義
變量類(lèi)型一旦定義則類(lèi)型確定不可發(fā)生修改,如:一個(gè)Int類(lèi)型的變量不可修改為字符串
// var 定義的變量可以發(fā)生修改
var i:Int = 10
// val 定義的變量不可發(fā)生修改
// 定義變量時(shí)數(shù)據(jù)類(lèi)型可省略,scala自動(dòng)識(shí)別變量的數(shù)據(jù)類(lèi)型
val j = 20
object Hello {
def main(args: Array[String]): Unit = {
var name = "wbb"
var age = 18
// 字符串連接
println(name + age)
// 字符串格式化輸出
printf("name: $s, age: $d", name, age)
// 多行字符串
var s =
"""
|select *
|from dual
|""".stripMargin
println(s)
// 變量引用(有點(diǎn)類(lèi)似于python)
var s1 =
s"""
|person:
|name: ${name} age:${age+2}
|""".stripMargin
println(s1)
}
}
輸入變量(從鍵盤(pán)接收變量值, 類(lèi)似java)
object Hello {
def main(args: Array[String]): Unit = {
// 從鍵盤(pán)接收字符串
var name = StdIn.readLine()
// 從鍵盤(pán)接收數(shù)字
var age = StdIn.readInt()
// 變量引用
println(s"name: ${name} age: ${age}")
}
}
3、數(shù)據(jù)類(lèi)型
數(shù)據(jù)類(lèi)型取值范圍Byte[1]-128 到 127Short [2]-32768 到 32767Int [4]-2147483648 到 2147483647Long [8]-(2 的(64-1)次方) = 2 的(64-1)次方-1Float [4]32 位, IEEE 754 標(biāo)準(zhǔn)的單精度浮點(diǎn)數(shù)Double [8]64 位 IEEE 754 標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)Char字符類(lèi)型Boolean布爾類(lèi)型Unit等同于java的void用作無(wú)返回值的方法的數(shù)據(jù)類(lèi)型,main方法的返回值就是UnitNull空類(lèi)型,僅有一個(gè)實(shí)例null。可以賦值給任意引用類(lèi)型(類(lèi)的實(shí)例),但不可以賦值給數(shù)值類(lèi)型。Nothingscala特有,表示所有類(lèi)的子類(lèi)。Nothing類(lèi)型的返回值可以兼容其他類(lèi)型,方便將該類(lèi)型的返回值賦值給其他方法或者變量(包括返回異常)
保留小數(shù)位數(shù)
var a:Double = 1.1111
// 四舍五入保留兩位小數(shù)
println(a.formatted("%.2f"))
4、分支語(yǔ)句(循環(huán))
在scala中if語(yǔ)法與java基本一致,在此處不做說(shuō)明,主要說(shuō)明不同于java的語(yǔ)法
4.1 for循環(huán)
// 從1循環(huán)到10(左閉右閉區(qū)間)
for(i<-1 to 10){
println(i)
}
4.2 util循環(huán)
// 從1循環(huán)到10(左閉右開(kāi)區(qū)間)
for(i<-1 until 10){
println(i)
}
4.3 循環(huán)守衛(wèi)
// 循環(huán)去1到10中3的倍數(shù),滿足條件進(jìn)入循環(huán),不滿足則continue
for(i<-1 to 10 if i % 3 == 0){
println(i)
}
4.4 步長(zhǎng)
// 從1循環(huán)到10的奇數(shù)。默認(rèn)步長(zhǎng)為 1
for(i<-1 to 10 by 2){
println(i)
}
4.5 嵌套循環(huán)
for(i<-1 to 10 by 2; j<-1 to 3){
println("" + i + "和" + j)
}
// for 循環(huán)內(nèi)有多個(gè)表達(dá)式用大括號(hào)換行,或者用小括號(hào)中間加分號(hào)
// 個(gè)人認(rèn)為第二個(gè)格式更美觀一些
for{i<-1 to 10 by 2
j<-1 to 3
}{
println("" + i + "和" + j)
}
4.5 while循環(huán)
while (i<10){
println(i)
i = i + 1
}
4.7 do——while
do {
println(i)
i = i + 1
} while (i<10)
4.8 break
Breaks.breakable(
for (i <- 1 to 10) {
println(i)
if (i == 5) Breaks.break()
}
)
四、函數(shù)
1、函數(shù)基礎(chǔ)
scala的函數(shù)不同于java,使用方法很靈活,基本屬于scala界的大哥大。建議使用的時(shí)候還是參考java進(jìn)行使用,嵌套過(guò)多反而不易解讀,導(dǎo)致程序可讀性和可維護(hù)性變差。
1.1 函數(shù)可以作為值進(jìn)行 傳遞
object Hello {
def main(args: Array[String]): Unit = {
//調(diào)用函數(shù),把返回值給變量 f(因?yàn)楹瘮?shù)沒(méi)有參數(shù),所以調(diào)用的括號(hào)可以省略)
//val f = fun1()
val f = fun1
println(f)
// 函數(shù)后面加 _,相當(dāng)于把函數(shù)當(dāng)成一個(gè)整體,傳遞給變量 f1,此時(shí)f1也是一個(gè)函數(shù),可以被調(diào)用
val f1 = fun1 _
f1()
//如果明確變量類(lèi)型,不使用下劃線也可以將函數(shù)作為整體傳遞給 變量
var f2:()=>Int = fun1
f2()
}
def fun1():Int = {
println("fun1被調(diào)用")
1
}
}
1.2 函數(shù)可以作為參數(shù)進(jìn)行傳遞
object Hello {
def main(args: Array[String]): Unit = {
def f1(a: Int, b: Int): Int = a + b
// 定義一個(gè)函數(shù),函數(shù)參數(shù)還是一個(gè)函數(shù)簽名;f 表示函數(shù)名稱(chēng);(Int,Int) 表示輸入兩個(gè) Int 參數(shù);Int 表示函數(shù)返回值
def f2(f: (Int, Int) => Int): Int = {
f(2, 4)
}
println(f2(f1))
}
}
1.3 函數(shù)可以作為返回值進(jìn)行傳遞
object Hello {
def main(args: Array[String]): Unit = {
def f2(): Any = {
def f1(a: Int, b: Int): Int = a + b
f1 _
}
println(f2())
}
}
2、函數(shù)進(jìn)階
2.1 模擬實(shí)現(xiàn)map映射
按照傳入的函數(shù)操作Array中的每個(gè)值
object Hello {
def main(args: Array[String]): Unit = {
// 定義函數(shù)map,第一個(gè)參數(shù)為數(shù)組,第二個(gè)參數(shù)為函數(shù)op,op的參數(shù)和返回值都是Int
// 返回值為Array,yield是將數(shù)組的每個(gè)值用函數(shù)進(jìn)行處理,每個(gè)值改變?yōu)楹瘮?shù)op的返回值
def map(arr: Array[Int], op: Int => Int) = {
for(a <- arr) yield op(a)
}
// 調(diào)用map,第一個(gè)參數(shù)是數(shù)組(1,2,3,4),第二個(gè)參數(shù)為匿名函數(shù),匿名函數(shù)返回值為參數(shù)的平方
var arr = map(Array(1, 2, 3, 4),(x:Int) => {x * x})
// 將Array轉(zhuǎn)換為字符串
println(arr.mkString(","))
}
}
2.2 模擬實(shí)現(xiàn)Filter過(guò)濾
按照函數(shù)的規(guī)則篩選Array
import scala.collection.mutable.ArrayBuffer
object Hello {
def main(args: Array[String]): Unit = {
// 定義函數(shù)filter,第一個(gè)參數(shù)為Array類(lèi)型,第二個(gè)參數(shù)為函數(shù)op,op的參數(shù)為Int類(lèi)型,返回布爾值
def filter(arr:Array[Int],op:Int =>Boolean) ={
// 定義變長(zhǎng) Array
var arr1:ArrayBuffer[Int] = ArrayBuffer[Int]()
// 便利array,每次元素調(diào)用op,返回值為true則將元素添加到變長(zhǎng)Array
for(elem <- arr if op(elem)){
arr1.append(elem)
}
// 變長(zhǎng)Array轉(zhuǎn)換為Array
arr1.toArray
}
// 調(diào)用filter,第一個(gè)參數(shù)為數(shù)組(1,2,3,4),第二個(gè)參數(shù)為匿名函數(shù),判斷匿名函數(shù)的參數(shù)是否為奇數(shù)
var arr1 = filter(Array(1, 2, 3, 4), _ % 2 == 1)
println(arr1.mkString(","))
}
}
2.3 模擬實(shí)現(xiàn)reduce規(guī)約累乘
將一個(gè)Array的元素逐個(gè)相乘
object Hello {
def main(args: Array[String]): Unit = {
def reduce(arr: Array[Int], op: (Int, Int) => Int) = {
var init: Int = arr(0)
for (elem <- 1 to arr.length) {
init = op(init, elem)
}
init
}
val chen = reduce(Array(1, 2, 3, 4), _ * _)
println(chen)
}
}
3、遞歸
階乘
object Hello {
def main(args: Array[String]): Unit = {
def jiechen(a: Int): Int = {
if (a == 1) {
return 1
}
a * jiechen(a - 1)
}
println(jiechen(3))
}
}
4、惰性加載
有時(shí)為了節(jié)約資源開(kāi)銷(xiāo),或者程序設(shè)計(jì),期望函數(shù)的返回值被使用的時(shí)候再去加載函數(shù),這里專(zhuān)業(yè)叫法是惰性加載,關(guān)鍵字為lazy。(lazy只可以加在val變量之前)
object Hello {
def main(args: Array[String]): Unit = {
lazy val res = addnum(1, 2)
println("test print")
// 此處用到變量值才開(kāi)始調(diào)用函數(shù)
println(res)
def addnum(a: Int, b: Int): Int = {
a + b
}
}
}
五、類(lèi)
1、類(lèi)的屬性
package com.wbb.testscala
import scala.beans.BeanProperty
class Person {
var name: String = "bobking"
// 給屬性age賦予默認(rèn)的Int值,這里查看是 0
var age: Int = _
// 注解為sex屬性添加了get set方法(與java bean類(lèi)似)
@BeanProperty var sex: String = "不詳"
}
object Person {
def main(args: Array[String]): Unit = {
var person = new Person()
println(person.name)
person.setSex("女")
println(person.getSex)
}
}
2、類(lèi)的方法
與java類(lèi)似下一小結(jié)中的say方法就是Person類(lèi)的方法
2.1構(gòu)造器
輔助構(gòu)造器:一個(gè)類(lèi)可以有多個(gè)輔助構(gòu)造器,輔助構(gòu)造器必須調(diào)用主構(gòu)造器,輔助構(gòu)造器可以有多個(gè)。
class Person {
var name: String = _
var age: Int = _
def this(age: Int) {
this()
this.age = age
println("輔助構(gòu)造器")
}
def this(age: Int, name: String) {
this(age)
this.name = name
}
println("主構(gòu)造器")
}
object Person {
def main(args: Array[String]): Unit = {
val person2 = new Person(22)
}
}
輸出結(jié)果如下
主構(gòu)造器
輔助構(gòu)造器
3、訪問(wèn)權(quán)限
package com.wbb.testscala
class Person {
// 私有屬性,僅類(lèi)和類(lèi)的對(duì)象可用
private var name: String = "bobking"
// 保護(hù)權(quán)限屬性,僅同類(lèi)和子類(lèi)可以使用
protected var age: Int = 18
// testscala包下的其他類(lèi)可以使用
private[testscala] var sex: String = "不詳"
def say(): Unit = {
println("牛B")
}
}
class Hiker extends Person {
def test(): Unit = {
this.age
this.sex
}
}
object Person {
def main(args: Array[String]): Unit = {
val person = new Person
person.say()
println(person.name)
println(person.age)
val wbb = new Hiker
println(teacher.age)
}
}
4、類(lèi)的繼承
scala的子類(lèi)繼承父類(lèi)的屬性和方法,先執(zhí)行父類(lèi)的構(gòu)造器再執(zhí)行子類(lèi)的構(gòu)造器。(只能是單繼承)
package com.wbb.testscala
class Person() {
var name: String = _
var age: Int = _
def this(age: Int) {
this()
this.age = age
println("輔助構(gòu)造器")
}
println("person的主構(gòu)造器")
}
class Hiker(p_name: String, p_age: Int) extends
Person{
var language: String = _
def this(p_name: String, p_age: Int, p_language: String){
this(p_name, p_age)
this.name = p_name
this.age = p_age
}
println("Hiker的主構(gòu)造器")
}
object Hello {
def main(args: Array[String]): Unit = {
val a = new Hiker("bobking", 30, "scala")
}
}
輸出結(jié)果為
person的主構(gòu)造器
Hiker的主構(gòu)造器
5、抽象
和java一樣,有時(shí)需要抽象出一個(gè)類(lèi),在這個(gè)類(lèi)的基礎(chǔ)上那可以拓展出多個(gè)子類(lèi),每個(gè)類(lèi)有自己獨(dú)有的實(shí)現(xiàn)方式。
package com.wbb.testscala
// 抽象類(lèi)(關(guān)鍵字abstract)
abstract class Person() {
// 抽象屬性(僅有屬性的定義,沒(méi)有賦值)
var name: String
// 抽象方法(僅有方法的聲明,沒(méi)有實(shí)現(xiàn)方式)
def who(): Unit
}
// 子類(lèi)繼承抽象類(lèi),必須實(shí)現(xiàn)抽象類(lèi)所有的方法與屬性
// 重寫(xiě)非抽象類(lèi)的方法和屬性不需要overwrite關(guān)鍵字
class Hiker() extends{
var name: String = "bobking"
def who(): Unit = {
println(this.name)
}
}
object Hello {
def main(args: Array[String]): Unit = {
val a = new Hiker()
a.who()
}
}
6、伴生對(duì)象
其實(shí)說(shuō)白了也就是java的靜態(tài)類(lèi),原理不同但實(shí)現(xiàn)的效果是沒(méi)什么差異的。類(lèi)的半生對(duì)象與類(lèi)同名,可以通過(guò)類(lèi)的半生對(duì)象直接訪問(wèn)類(lèi)的屬性和方法,不需要再單獨(dú)定義一個(gè)類(lèi)對(duì)象,從而實(shí)現(xiàn)單實(shí)例。
package com.wbb.testscala
class Person {
var name: String = "bobking"
}
object Person {
var age:Int = 35
}
object Hello {
def main(args: Array[String]): Unit = {
println(Person.name)
}
}
7、類(lèi)的特質(zhì)
java中有接口,scala中同樣有,將通用的方法和屬性進(jìn)行封裝。(關(guān)鍵字 Trait)
scala的類(lèi)僅可以單繼承,但是特質(zhì)可以多繼承,多個(gè)特質(zhì)之間用with關(guān)鍵字進(jìn)行連接。
特質(zhì)的使用很靈活可以不進(jìn)行定義直接在創(chuàng)建對(duì)象的時(shí)候混入。繼承特質(zhì)時(shí)特質(zhì)中的抽象類(lèi)和抽象方法都需要重寫(xiě),非抽象屬性不可以重新賦值。
package com.wbb.testscala
// 定義特質(zhì),特質(zhì)中的屬性和方法可以使抽象的也可以是具體的
trait PersonTrait {
var name: String = _
var age: Int
def play(): Unit = {
println("摸魚(yú)")
}
def say(): Unit
}
trait SexTrait {
var sex: String
}
trait HobbyTrait{
var hobby: String = "愛(ài)吃了睡"
}
//一個(gè)類(lèi)可以實(shí)現(xiàn)/繼承多個(gè)特質(zhì)
class Hiker extends PersonTrait with SexTrait {
override def say(): Unit = {
println("say")
}
override var age: Int = _
override var sex: String = _
}
object Test {
def main(args: Array[String]): Unit = {
val hiker = new Hiker
hiker.say()
hiker.play()
// 動(dòng)態(tài)混入
val t2 = new Hiker with HobbyTrait {
}
//調(diào)用混入 trait 的屬性
println(t2.hobby)
}
}
7.1 特質(zhì)疊加
當(dāng)一個(gè)類(lèi)繼承多個(gè)特質(zhì),特質(zhì)中有同名方法是就會(huì)涉及到特質(zhì)疊加。
super.play是執(zhí)行疊加好的下一個(gè)對(duì)象的play方法
疊加順序如下
Hiker——>HobbyTrait——>SexTrait——>PersonTrait
package com.wbb.testscala
trait PersonTrait {
var name: String = _
def play(): String = {
"摸魚(yú)"
}
}
trait SexTrait extends PersonTrait {
override def play(): String = {
"男-" + super.play()
}
}
trait HobbyTrait extends PersonTrait {
override def play(): String = {
"愛(ài)吃了睡-" + super.play()
}
}
class Hiker extends SexTrait with HobbyTrait {
override def play(): String = {
"程序員-" + super.play()
}
}
object Test {
def main(args: Array[String]): Unit = {
val hiker = new Hiker
val p = hiker.play()
println(p)
}
}
調(diào)用某個(gè)繼承特質(zhì)的方法:super[特質(zhì)名稱(chēng)].fangfam()
hiker對(duì)象
輸出結(jié)果為
程序員-愛(ài)吃了睡-男-摸魚(yú)
package com.wbb.testscala
class Person {
var name: String = _
}
object Test {
def main(args: Array[String]): Unit = {
var hiker = new Person()
// 判斷對(duì)象是否是某個(gè)類(lèi)的實(shí)例
println(hiker.isInstanceOf[Person])
// 將對(duì)象轉(zhuǎn)換為某個(gè)類(lèi)的實(shí)例
var h1 = hiker.asInstanceOf[Person]
println(h1)
// 獲取類(lèi)信息
println(classOf[Person])
}
}
輸出結(jié)果如下
true
com.wbb.testscala.Person@5e025e70
class com.wbb.testscala.Person
六、集合
Scala 的集合有三大類(lèi):序列 Seq、集 Set、映射 Map,所有的集合都擴(kuò)展自 Iterable
特質(zhì)。
不可變集合:scala.collection.immutable
可變集合: scala.collection.mutable
1、數(shù)組
1.1 不可變數(shù)組
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
// 數(shù)組定義
val a1 = new Array[Int](5)
println(a1.length)
val a11 = Array(1, 2, "aaa")
println(a11.mkString(","))
// 數(shù)組元素賦值,注意這里是圓括號(hào)
a1(2) = 1
// 修改數(shù)組下標(biāo)為1的元素值為10
a1.update(1, 10)
// 數(shù)組轉(zhuǎn)字符串(查看)
println(a1.mkString(","))
// 數(shù)組遍歷
for(ele <- a1){
println(ele)
}
a1.foreach((x:Int)=>{println(x)})
// 數(shù)組添加元素,在a1的基礎(chǔ)上添加元素 5,組成新的數(shù)組
val a2: Array[Int] = a1 :+ 5
println(a2.mkString(","))
}
}
1.2 可變數(shù)組
package com.wbb.testscala
import scala.collection.mutable.ArrayBuffer
object Hello {
def main(args: Array[String]): Unit = {
// 可變數(shù)組定義,并為數(shù)組賦初始值
var a1 = ArrayBuffer[Any](1, 2, 3)
println(a1.mkString(","))
// 查看數(shù)組的hash值
println(a1.hashCode())
a1.+= (3)
// 追加元素 4,5到數(shù)組
a1.append(4, 5)
println(a1.mkString(","))
// 在數(shù)組0號(hào)位添加元素 5,6
a1.insert(0, 5, 6)
println(a1.mkString(","))
}
}
1.3 轉(zhuǎn)換
// 可變數(shù)組轉(zhuǎn)不可變
a2 = a1.toArrry
// 不可變數(shù)組轉(zhuǎn)可變
a3 = a2.toBuffer
1.4 多維數(shù)組
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
// 可變數(shù)組定義,并為數(shù)組賦初始值
var a1 = Array.ofDim[Any](2, 3)
a1(1)(1) = "wbb"
for(x <- a1){
for(j <- x){
println(": " + j)
}
}
}
}
2、列表
2.1 不可變list
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
val l = List(1, 2, 3)
// Nil為空
val l1 = 1::2::Nil
// 在l列表的前面加元素 4
val l2 = 4::l
// 在頭部添加元素 5
val l3 = l.+:(5)
// 在尾部添加元素 5
val l31 = l.:+(5)
// 將兩個(gè)列表連接成為一個(gè)
val l4 = l:::l1
l4.foreach(println)
}
}
2.2 可變listBuffer
package com.wbb.testscala
import scala.collection.mutable.ListBuffer
object Hello {
def main(args: Array[String]): Unit = {
// 創(chuàng)建一個(gè)可變數(shù)組
val b = ListBuffer(1,2,3,4)
// 向數(shù)組中添加數(shù)據(jù)
b.+=(5)
b.append(6)
// 向數(shù)組指定位置添加元素
b.insert(1,2,3)
// 修改數(shù)據(jù)
b(1) = 6
b.update(1,7)
// 刪除數(shù)據(jù)
b.-=(5)
b.remove(5)
}
}
3、集合
集合的元素不可重復(fù),元素?zé)o序
3.1 不可變集合
val set = Set(1,2,3)
3.2 可變集合
package com.wbb.testscala
import scala.collection.mutable
object Hello {
def main(args: Array[String]): Unit = {
// 創(chuàng)建可變集合
val s = mutable.Set(1,2,3,4,5,6)
// 集合添加元素
s += 8
// 向集合中添加元素,返回一個(gè)新的 Set
val s1 = s.+(9)
// 刪除數(shù)據(jù)
s-=(5)
}
}
4、Map集合
用于存儲(chǔ)鍵值對(duì)
4.1 不可變Map
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
// 創(chuàng)建map
val map = Map("a"->1, "b"->2, "c"->3)
// 遍歷map中的值
for(m <- map.keys){
println(map(m))
}
// 按照key值獲取對(duì)應(yīng)的map值,若未找到則賦值為0
println(map.getOrElse("d", 0))
// 循環(huán)打印map
map.foreach(m=>{println(m)})
}
}
4.2 可變map
package com.wbb.testscala
import scala.collection.mutable
object Hello {
def main(args: Array[String]): Unit = {
// 創(chuàng)建可變map
val map = mutable.Map("a"->1, "b"->2, "c"->3)
// map添加元素
map.+=("d"-> 4, "e"->5)
// map刪除元素
map.-=("a","b")
// map修改值
map.update("c", 100)
map.foreach(m=>{println(m)})
}
}
5、元組
元組就是將多個(gè)無(wú)關(guān)的數(shù)據(jù)封裝為一個(gè)整體(元組最大可有22個(gè)元素)
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
// 聲明元組
val tuple:(String, Int, String) = ("wbb",20,"男")
// 元組訪問(wèn)
println(tuple._1)
// 通過(guò)下標(biāo)訪問(wèn)元組
println(tuple.productElement(0))
// 通過(guò)迭代器訪問(wèn)
for(t <- tuple.productIterator){
println(t)
}
}
}
6、集合操作
6.1 定義集合
val l: List[Int] = List(1,2,3,4)
val l1: List[Int] = List(5,6,7,8)
6.2 判斷l(xiāng)ist是否包含 3
println(l.contains(3))
輸出結(jié)果
true
6.3 獲取集合的首個(gè)元素
println(l.head)
輸出結(jié)果
1
6.4 獲取集合的最后一個(gè)元素
println(l.last)
輸出結(jié)果
4
6.5 獲取集合的尾(去除頭元素)
println(l.tail)
輸出結(jié)果
List(2,3,4)
6.6 獲取集合的頭(去除最后一個(gè)元素)
println(l.init)
輸出結(jié)果
List(1,2,3)
6.7 集合反轉(zhuǎn)
println(l.reverse)
輸出結(jié)果
List(4,3,2,1)
6.8 集合截?。◤淖箝_(kāi)始2位)
println(l.take(2))
輸出結(jié)果
List(3, 4)
6.9 集合刪除元素(右開(kāi)始2位)
println(l.dropRight(2))
輸出結(jié)果
List(1, 2)
6.10 集合拉鏈
println(l.zip(l1))
輸出結(jié)果
List((1,5), (2,6), (3,7), (4,8))
6.11 集合滑動(dòng)
l.sliding(3,2).foreach(println)
輸出結(jié)果
List(1, 2, 3)
List(3, 4)
6.12 集合排序
package com.wbb.testscala
object Hello {
def main(args: Array[String]): Unit = {
val l: List[Int] = List(1,2,3,-4)
// 求和
println(l.sum)
// 求乘積
println(l.product)
println(l.max)
println(l.min)
println(l.sorted)
// 按照絕對(duì)值排序
println(l.sortBy(x=>x.abs))
// 按照指定規(guī)則排序(從小到大)
println(l.sortWith((x,y)=>(x } } 七、函數(shù)進(jìn)階 package com.wbb.testscala object Hello { def main(args: Array[String]): Unit = { val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) val nestedList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) val wordList: List[String] = List("hello world", "hello wbb", "hello hiker") // 過(guò)濾 println(list.filter(x => x % 2 == 0)) // 轉(zhuǎn)化 println(list.map(x => x + 1)) //扁平化 println(nestedList.flatten) // 扁平化+映射 注:flatMap 相當(dāng)于先進(jìn)行 map 操作,在進(jìn)行 flatten操作 println(wordList.flatMap(x => x.split(" "))) //分組 println(list.groupBy(x => x % 2)) } } 執(zhí)行結(jié)果如下 List(2, 4, 6, 8) List(2, 3, 4, 5, 6, 7, 8, 9, 10) List(1, 2, 3, 4, 5, 6, 7, 8, 9) List(hello, world, hello, nidaye, hello, scala) Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8)) 八、隊(duì)列 先進(jìn)先出 package com.wbb.testscala import scala.collection.mutable object Hello { def main(args: Array[String]): Unit = { val que = new mutable.Queue[String]() que.enqueue("a", "b", "c") println(que.dequeue()) println(que.dequeue()) println(que.dequeue()) } } 九、模式 package com.wbb.testscala object Hello { def main(args: Array[String]): Unit = { var a = 1 var b = 2 var op = "no" var res = op match{ case "+" => a + b case "-" => a - b case _ => "未知" } println(res) } } 模式守衛(wèi) package com.wbb.testscala object Hello { def main(args: Array[String]): Unit = { def abs(x:Int)=x match{ case i:Int if i > 0 => x case j:Int if j < 0 => -x case _ => "啥也不是" } println(abs(-5)) } } latten) // 扁平化+映射 注:flatMap 相當(dāng)于先進(jìn)行 map 操作,在進(jìn)行 flatten操作 println(wordList.flatMap(x => x.split(" "))) //分組 println(list.groupBy(x => x % 2)) } } 執(zhí)行結(jié)果如下 ```textile List(2, 4, 6, 8) List(2, 3, 4, 5, 6, 7, 8, 9, 10) List(1, 2, 3, 4, 5, 6, 7, 8, 9) List(hello, world, hello, nidaye, hello, scala) Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8)) 八、隊(duì)列 先進(jìn)先出 package com.wbb.testscala import scala.collection.mutable object Hello { def main(args: Array[String]): Unit = { val que = new mutable.Queue[String]() que.enqueue("a", "b", "c") println(que.dequeue()) println(que.dequeue()) println(que.dequeue()) } } 九、模式 package com.wbb.testscala object Hello { def main(args: Array[String]): Unit = { var a = 1 var b = 2 var op = "no" var res = op match{ case "+" => a + b case "-" => a - b case _ => "未知" } println(res) } } 模式守衛(wèi) package com.wbb.testscala object Hello { def main(args: Array[String]): Unit = { def abs(x:Int)=x match{ case i:Int if i > 0 => x case j:Int if j < 0 => -x case _ => "啥也不是" } println(abs(-5)) } } 柚子快報(bào)激活碼778899分享:Scala 推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。