Scala學習總結(from scala for the Impatient)

Peng__Ge發表於2018-03-09

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的是相同的。

相關文章