Scala學習總結(from scala for the Impatient)
2018/05/14更:Scala特質 Trait。
這本書很適合初學者,如果有需要可以留下郵箱,或者私信,我發電子版給你們!
基礎語法(1):
scala shell 環境退出: :quit語句
=> 符號作用類似於Python 匿名函式lambda;
val a = 'b' a:Char b 字元型資料 val test = "a" type:字串 所以,Scala用單引號和雙引號出來的資料型別是不同的,並且
val a = 'bb'會報錯
test.trim 刪除字串前後空白符
a.toUpperCase大寫轉換,a.toLowCase,小寫轉換,a.toString,字串轉換,通過tab鍵,可以檢視當前變數能夠使用的方法;帶不帶括號是一樣的,內建方法;
val:不可變變數,可認為不可變,例如 val a =1,再定義 a=2;即報錯,val a =2可以,這是重新定義變數;
var:可變變數,例如val a =1, 再輸入 a=2;也是可以通過編譯的,這是兩者區別。
並且val是被孤立使用的,因為用var之後,你無法預知後面的結果,可能在中途你對其進行了改變卻忽略了這個過程;
如果在定義變數時,需要強調型別,可以使用 val a: Int = 1;類似這種方法;
在迭代計算的時候,記住用var 定義變數,否則無法編譯通過,因為val定義值是不變的;
List是列表,Buffer是可變列表;Iterable[Int](1,2) 也會生成一個List(1,2);Iterable 是一個迭代型別
基礎語法(2):
a+b 的簡寫 a.+(b)其實不直觀!
import scala.math._ 匯入數學運算包,_代表一個萬用字元,類似於JAVA 的*;
在Scala中,方法不含有引數時,不用(),含有引數時,需要(),例如:"Hello".distinct去重,而 count方法,需要();
在Scala中常用的{},裡面包括的多重表示式是代表一個模組,其中結果是最後一個表示式的結果!特別注意
在定義完值、變數、函式之後,最後在後面加上你需要返回值的型別;否則你也不能確定它返回什麼結果,對你下一步工作造成影響
Scala 迴圈:Scala 沒有Break 和Continue 來控制迴圈,你可以通過布林量打破迴圈或者返回中間量,或者利用Control.Break來打破訓練,但這種方法是利用捕獲異常實現,會消耗大量時間!
yield生成器:這個同Python 一樣,實現迭代;在Python中類似於容器,裝有一系列元素,通過.next按序捕獲元素;
3:Scala 函式:
Scala 函式初接觸會有點陌生,例如:
def fac(n:Int){
var r =1; for (i<- 1 to n)
r = r*i
r} 該函式返回的結果是一個Unit,一個單元;如果你{}前面加“=”號,才是返回值,特別注意!
def fac(n:Int) :Int={ #定義返回值型別,返回值是r,型別是Int,並且,Scala不建議使用Return!
var r =1; for (i<- 1 to n)
r = r*i
r}
scala Process 捕獲異常,這個問題我還沒搞清楚;之後補充,我要去跟我師姐討論一下;
3、Scala Array基礎知識
定義Array: val nums = new Array[Int](10) ;new生成新物件,一維矩陣,Array內建函式,[Int]代表矩陣元素型別;(10)矩陣長度;可以通過Array.length 觀察矩陣的列數(長度),Array()通過索引選擇元素,索引不能超過最大長度且索引計數從0開始;Array長度是不可變的。
ArrayBuffer長度可變,但是需要通過import scala.collection.mutable.ArrayBuffer匯入,且動態陣列可以用.append增加元素,靜態是不可以的。
val arrbuff += ArrayBuffer 通過+號可以增加元素,對變長陣列而言!陣列的操作語句如下:
insert(a,b);a表示索引位置,b表示元素值;與Python相似;且b可以是幾個元素,如a.insert(2,7,8,9);表示在索引2的位置,連續插入三個元素;
remove,移除元素,例如a.remove(2)==a.remove(2,1)移除矩陣中索引2位置開始的第一個元素,第二個引數其實是移除的元素數量,不寫就表示是1;請知曉!
reverse() 倒轉,例如val a = Array(1,2,3,4) a.reverse 之後的結果:Array(4,3,2,1)
sum:a.sum 矩陣求和運算,對元素進行求和,要求元素是數值型別;比如a.sum(前面的矩陣) 結果是10;
max,min函式:內建最值方法,可以用於計算字元型陣列;數值型是最大最小值,字元型的話按字母大小選擇,如果相同位置字母相同,依次往後比較;
sorted:矩陣排序,需要元素型別一致,全是字元型或者全是數值型,否則報錯:no implicit ordering defined by Any.
mkString 將陣列轉換成字串,且可以在間隔位置插入某個字元元素:
import util.Sorting.quickSort val a =Array(1,2,3,5) val result = a.mkSorting("b")
result = String:1b2b3b5b字串型別
3.1 多維陣列:
多維陣列定義 val matrix = Array.ofDim[資料型別](3,4),矩陣維度;
賦值:matrix(row)(column) = num 對其進行賦值;
另一種第一方法 val matrix = new Array[Array[Int]](num);其實就是陣列裡面元素是陣列;
賦值:matrix(i) = new Array[Int](num) 賦值給matrix 第i個位置一個陣列,如果需要對陣列元素進行賦值的話;則是:
matrix(i)(j);j代表陣列中陣列的第j個位置
4:Map and tuple:對映和元祖;對映與Python字典類似;定義過程
import scala.collection.mutable.Map val a = Map("a"->1;"b"->2);可認為前者就是鍵,通過鍵找到值,a("b")返回1;
對於Map,類似於Python的字典,有鍵和值,可以做迴圈;
Tuple:
Scala 元祖建立直接用()即可val a =(1,2,3),元祖不能改變,同Python,切記:取元祖元素方法是a._1類似;元祖索引從1開始
Scala Object:由於Scala沒有static方法,即用Object構造;
object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1; lastNumber }
} 如果你需要生成一個新的lastNumber,可以直接呼叫Accounts.lastNumber實現自加功能;
5 Scala 過載:overridding method
Scala 中抽象類(Abstract方法不能被過載);過載方法需要用關鍵詞override註明;
檢驗某個方法是否屬於該類,可以通過isInstanceOf方法;
6 Scala 檔案讀取與正則
檔案讀取:import scala.io.Source val source = Source.fromFile("Myfile.txt","UTF-8") //第二個引數是編碼
val lineIterator = source.getLines //獲取檔案行;一個迭代器
for (l<- lineIterator) process //迴圈處理每行
val lines = source.getLine.toArray //將行轉換成陣列;
val contents = source.mkString //將整個檔案內容轉成字串
檔案書寫:
PrintWrite
正則表達:
感覺正則表達還是很重要的,在哪裡都用得到,測試指令碼、爬蟲、前端、資料清洗等等,有興趣的可以參考我另外一篇博文;內容大多來自於《Re正則必知必會》,這本書挺好的!
Scala 正則通過 import scala.util.matching.Regex 匯入,Python是import re
example: val num = "[0-9]+".r 匹配開頭是0-9中的任意一個數字的字串。
num.findAllIn("contents")和num.findFirstIn("contnets")區別:通過編譯之後,findAllIn會找到內容中所有匹配的選項,而firdt只需要找到一條記錄;
scala slice:函式,字串切片,a.slice(2,4),=,包含索引為2的位置元素和3的位置元素,不含有位置4
Scala trait:是程式碼複用的基礎,可以用來封裝方法和欄位,然後再重用它們,但是特質定義不接受引數,否則報錯。例如:
trait test_demo{
def test{
print("this is a demo")
}
}
class Frog extends test_demo{
override def toString="test"
}
frog = new Frog
frog.test
"this is a demo"
特質Trait通過用extends 繼承,如果又要繼承類,又要繼承Trait,可以利用 extends class with trait with trait
補充:Scala 沒有列舉型別,但是可以通過extends Enumeration繼承列舉方法;Spark中RDD彈性分散式資料集是隻讀的;所以你需要新增資料時,需要採用Union 或者Union all;前者會過濾兩條相同記錄;後者不會,與SQL的是相同的。
相關文章
- Scala集合學習總結
- Scala 的學習
- Scala學習筆記筆記
- Scala基礎學習
- Scala學習記錄01
- 學習Scala IF…ELSE 語句
- Scala基本語法學習
- 學習Scala 方法與函式函式
- word_count的scala學習
- 2020-09-29【學習筆記】scala語言(三十三) scala中的抽象方法筆記抽象
- Scala
- scala資料結構(一)資料結構
- 2020-09-25【學習筆記】scala語言(二十九) scala中的建立物件筆記物件
- Scala學習筆記(2)-基礎語法筆記
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- Scala - DataFrame
- Awesome Scala
- scala(一)
- Scala程式碼練習(複習用)
- scala入門之編寫scala指令碼指令碼
- 一起學Scala 模式匹配模式
- 一起學Scala Trait(特徵)AI特徵
- 【Scala之旅】控制結構和註解
- 學習scala,java安裝jdk及jre的問題JavaJDK
- Scala特質
- Scala(四):物件物件
- Scala(三):類
- scala(四)集合
- Scala操作Map
- scala 列舉
- Flink - 安裝包scala 2.12和scala 2.11的區別
- scala怎麼退出
- scala物件導向物件
- 17 scala集合使用
- The Coding Kata: FizzBuzzWhizz in Scala
- Scala筆記(一)筆記
- scala(二)-for迴圈
- scala(三)函式函式