scala學習筆記(一)

2020-10-07 異步社區

1、scala入門準備工作

學習環境我是這樣搭建的

首先選擇ubuntu linux 14.04

然後安裝docker 安裝docker教程點這裡

安裝好後docker後,下載scala環境鏡像

sudo docker pull index.alauda.cn/ttch/scala

下載好後,然後執行如下命令

sudo docker run --rm \ -v 本地目錄:/scala \ -it index.alauda.cn/ttch/scala bash

可以看到進入了一個bash console下。然後嘗試執行scala。這樣就進入了控制臺程序中。

2、scala學習之旅

scala文法結構參考如下地址點擊

閱讀了不少scala的書籍和文章,幾乎沒有一個系統結構性講解scala的。所以這也是寫本系列文章的目的

下面簡單按照幾個結構進行整理和學習:

  • scala語法結構
  • 函數式
  • 算子
  • 組合算子

爭取能梳理一個系統的文章路徑,提供快速學習scala(本身scala這個語言的學習曲線也十分陡峭)

2.1、 scala語法結構

下面我們從文法角度去逐個使用例子看scala的使用方式和方法。

2.1.1關鍵詞

abstract case catch class defdo else extends false finalfinally for forSome if implicitimport lazy macro match newnull object override package privateprotected return sealed super thisthrow trait try true typeval var while with yield_ : = => <- <: <% >: # @

以上是的關鍵詞組成

2.1.2 變量和常量聲明的文法結構

那麼下面先通過scala的交互命令行來進行基本的實驗和講解。

首先先來實驗基本的定義聲明,那麼看看她的文法是什麼樣的?

Dcl ::= 『val』 ValDcl | 『var』 VarDcl | 『def』 FunDcl | 『type』 {nl} TypeDcl

定義聲明分成4部分。

那麼首先看下完成val定義文法


方法1:

plainid ::= upper idrest | varid | opid ::= plainid | 『`』 stringLiteral 『`』ValDcl ::= ids 『:』 Typeids ::= id {『,』 id}

方法2:

PatVarDef ::= 『val』 PatDef | 『var』 VarDefPatDef ::= Pattern2 {『,』 Pattern2} [『:』 Type] 『=』 ExprPattern2 ::= varid [『@』 Pattern3] | Pattern3Pattern3 ::= SimplePattern | SimplePattern { id [nl] SimplePattern }SimplePattern ::= 『_』 | varid | Literal | StableId | StableId 『(』 [Patterns 『)』 | StableId 『(』 [Patterns 『,』] [varid 『@』] 『_』 『*』 『)』 | 『(』 [Patterns] 『)』 | XmlPattern

兩種定義常量的方法可以看出,一個是需要提供類型

val valname : type = ...

另一種是直接定義常量,通過推導的方式得到常量的類型和初始化值。

val valname = ...

假設()為可以存在或者不存在,按照語言的結構可以按照這樣的理解

val valname (: type) = 推導公式

下面列舉一些patVarDef中 val的定義方式有以下幾種:

1.1

val (abc, bcd) = ("123","123")

結果為:

abc: String = 123bcd: String = 123

1.2

val abc = (2,3)

結果為:

x: (Int, Int) = (2,3)

1.3

val array@Array(_,test) = Array("hello","hello")

結果為

array: Array[String] = Array(hello, hello)test: String = hello

那麼在上面的文法中可以看到可以跟指定 Type

val array@Array(test1:Any,test:String) = Array("hello","hello")

結果為:

array: Array[String] = Array(hello, hello)test1: Any = hellotest: String = hello

1.4

val array@_,array2@_ =( Array("hello","hello"),Array("test","test"))

上面是一個多常量初始化賦值的文法,結果如下:

array: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))array2: (Array[String], Array[String]) = (Array(hello, hello),Array(test, test))

那麼左邊加上括號是有上面區別呢?

val (array@_,array2@_) =( Array("hello","hello"),Array("test","test"))

結果如下:

array: Array[String] = Array(hello, hello)array2: Array[String] = Array(test, test)

2.1.3 StableId

如果需要了解更多可以點擊官方參考, 那麼上面文法多次提到了StableId,stableId的文法是有如下構成的。

StableId ::= id | Path 『.』 id id ::= plainid | 『`』 stringLiteral 『`』 plainid ::= upper idrest | varid | opvarid ::= lower idrestupper ::= 『A』 | … | 『Z』 | 『$』 | 『_』 // and Unicode category Lulower ::= 『a』 | … | 『z』 // and Unicode category Llidrest ::= {letter | digit} [『_』 op]

那麼根據官方參考來看看如下模式如何使用

如下有3種模式:

SimplePattern ::= StableId | StableId 『(』 [Patterns 『)』 | StableId 『(』 [Patterns 『,』] [varid 『@』] 『_』 『*』 『)』

根據上面文法樹分支可以得到4種模式

  • Stable Identifier PatternsSimplePattern ::= StableId
  • Constructor PatternsSimplePattern ::= 『(』 [Patterns 『)』
  • Extractor PatternsSimplePattern ::= 『(』 [Patterns 『)』
  • Pattern SequencesSimplePattern ::= StableId 『(』 [Patterns 『,』] [varid 『@』] 『_』 『*』 『)』

下面一個個分析其中模式和代碼方式,這裡只從val和var的角度去看待,其他模式下的使用方式暫時不作實驗記錄。

2.1.4 Stable Identifier Patterns

假設有這樣一個需求,需要聲明一個常量a,常量A初始化為C,現在需要確定C變量是否和B變量值匹配,如果不一樣則報錯。

那麼可以這樣寫 val B , C = "hello"

結果如下:

B: String = helloC: String = hello

賦值代碼如下:

val a@B = C

結果如下:

a: String = hello

2.1.5 Constructor Patterns

例子1

val a@("hello",1) = ("hello",1)

結果如下 :

a: (String, Int) = (hello,1)

例子2

val a@("hello","string") = ("hello",1)

結果如下:

<console>:8: error: type mismatch;found : String("string")required: Int val a@("hello","string") = ("hello",1) ^

從上面可以看出,構建常量的匹配初始化校驗方式。

2.1.6 Extractor Patterns

官方例子:

val x = (1, 2)val y = x match { case Pair(i, s) => Pair(s + i, i * i)}

2.1.7 Pattern Sequences

val a@Seq('h','e','l',test @ _*) = Seq('h','e','l','l','o')a: Seq[Char] = List(h, e, l, l, o)test: Seq[Char] = List(l, o)

相關焦點

  • 函數式編程Scala詳細總結(Spark的程式語言)
    (一)Scala的環境搭建及第一個Scala程序Scala的安裝環境包括jdk環境、scala語言環境、集成開發環境:(1)jdk的下載由於Scala語言基於Java虛擬機,所以得需要安裝jdk,建議安裝1.7以上版本,大家到尋找相應的版本即可
  • Scala學習手冊(Learning Scala)第四章習題
    加油鴨Scala學習手冊(Learning Scala)第四章習題1、寫一個函數,給定一個圓的半徑,計算這個圓的面積。scala> def area(r:Double):Double = r*r*3.14area: (r: Double)Doublescala> area(5)res30: Double = 78.5也可以使用math.pow(r,2)來計算平方2、對練習1中的函數提供一個替代形式,將半徑作為一個String,如果調用這個函數時提供了一個空String
  • tensorflow2.0學習筆記(一)
    tensorflow2.0學習筆記(一)>這是本人自學tensorflow的筆記,用於記錄。
  • Java初學,學習筆記(一)
    4.流程控制 第四章流程控制,介紹java語言中流程控制分成三類:順序結構,選擇(分支)結構,循環結構。包括一些關鍵字的使用,本章會進行講解。循環結構對於很多初學者是比較難的一個技能點,也是Java的入門技能點,經常有人說學會了循環你才是跨進了Java學習的門檻。
  • Scala對於大數據開發重要嗎?Scala基礎學習建議
    並且,Scala作為一門JVM的語言,大數據生態的大部分組件都是Java語言開發的,而Scala可以與Java而對於Scala的學習,建議先學點Scala基礎,再進入到Spark的學習,這樣能夠更好地理解和掌握Spark當中的重要知識點。對於大數據開發工程師,建議掌握的Scala基礎如下:1、scala特性,包括面向對象特性、函數式編程、靜態類型、擴展性和並發性。
  • 從0開始學習spark的學習筆記(1)
    4.4 RDD:彈性式分布式數據集(resilient distributed dataset)),控制整個集群,監控Worker。RDD:Spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph。
  • 某廢的python學習筆記(一)——基礎語法
    某廢的python學習筆記(一)——基礎語法1、編碼默認情況下,Python 3源碼文件以UTF-8編碼,所有字符串都是unicode字符串。(2)多行注釋可以用多個39;&39;和&34;",實例(Python 3.0+):
  • SQL學習筆記3:count(*)函數
    1.count(*)函數用法COUNT(*) 函數返回表中的記錄數,具體來說,返回值是一個數字。圖醜~1)需要得到公司所有員工數兒2)返回大於40歲的人的數量:語句:SELECT COUNT(*) FROM Persons WHERE Age>40結果:3.
  • C語言學習筆記(一)
    關於C語言1.1 C語言歷史學習一項新的技術,我們總要先學習它的歷史,了解它的起源不僅有利於我們把握它的特點,也可以讓我們清楚他的發展前景。C語言於1972年11月問世,1978年美國電話電報公司(AT&T)貝爾實驗室正式發布C語言,1983年由美國國家標準局(American National Standards Institute,簡稱ANSI)開始制定C語言標準,1989年,ANSI發布了第一個完整的C語言標準——ANSI X3.159
  • Scala隱式轉換入門實踐
    隱式轉換(Implicit Conversion)是Scala語言提供的一個強大的語法特性,是學習Scala必須要掌握的技能。一、Scala提供的隱式轉換函數Scala的隱式轉換無處不在。在實際開發過程中,常常會自動地使用隱式轉換。
  • 我拿到了阿里大牛(清華畢業生)總結的大數據學習路線+視頻教程
    >一門JVM系語言:當前大數據生態JVM系語言類的比重極大,某種程度上說是壟斷也不為過。這裡我推薦大家學習Java或Scala,至於Clojure這樣的語言上手不易,其實並不推薦大家使用。另外,如今是「母以子貴」的年代,某個大數據框架會帶火它的程式語言的流行,比如Docker之於Go、Kafka之於Scala。因此筆者這裡建議您至少要精通一門JVM系的語言。
  • Eclipse創建第一個Scala項目
    安裝JDK,我已經安裝好了,如果不會安裝搜索之前的文檔《Win10+Java1.8環境搭建(圖解教程)》安裝Maven,我已經安裝好了,如果不會安裝搜索之前的文檔《Eclipse配置Maven3.5》SCALA安裝解壓scala壓縮包
  • Vue學習筆記(一)
    一.MV* 模式(MVC/MVP/MVVM)"MVC": model view controller用戶對View操作以後,View捕獲到這個操作,會把處理的權利交移給Controller(Pass calls);Controller會對來自View數據進行預處理、決定調用哪個Model的接口;然後由Model
  • React學習筆記(一)
    A JavaScript library for building user interfacesReact不是一個完整的MVC框架,最多可以認為是MVC中的V(View),甚至React並不非常認可MVC開發模式;React 構建頁面 UI 的庫。
  • 我的blender學習筆記(1)(非教程)基礎操作快捷鍵
    既然有人問到了,就在開頭說一下,寫這個就是用來堅持學習,以及自我總結,我學過的軟體很多,學到一半扔一邊的也很多,天生不自覺沒辦法。所以先聲明,這不是教程。教程請自行百度。最近新了解到了blender這個軟體,感覺和其他軟體操作不太一樣,每天能學習的時間不多,就做個筆記給自己總結一下要點,加深記憶,方便以後查看。1.滾輪:放大縮小視圖,按住滾輪拖動旋轉視圖。shift+滾輪按壓+拖動:平移視圖。
  • 最全java知識體系圖及100G學習資料(含視頻,源碼筆記)
    因為目前新老項目比較趕,還抽不出時間大篇幅的進行細緻地畫重點,所以我就大概列了下學習所需時間(兩個舊框架可先不學)部分筆記截圖:當然,筆記不是讓你抄的,別人的筆記始終是別人的!自己做的筆記才是自己的!周末有空我在抽出一整天詳細畫重點,力求讓你用最少的時間,學最需要的知識!需要學習資料關注後私信「資料」即可。私信方法:第一步,點擊頭像。第二步:頭像旁邊有一個私信按鈕,點擊回復 "資料「 即可。
  • IntelliJ IDEA:Scala、sbt、maven配置教程
    Spark是由Scala語言編寫,所以,學習Spark之前,先掌握Scala是由必要的。那這篇文章,就先講解一下Scala如何在IDEA中進行配置使用。需要注意,這裡安裝的只是IDEA的scala插件 接著,我們新建一個scala項目,File——New——Scala——IDEA,然後這裡,如果你沒有安裝scala的話,需要點擊Creat....——Download....
  • 區塊鏈學習筆記(一)
    一、區塊鏈是什麼?分布式網絡解決共識問題,並記錄和token(資產憑證)相關的內容可以構建去中心化的小型經濟系統二、區塊鏈如何運行?挖礦(打包transaction)將transaction用區塊封裝。方便打包人籤名,另一方面需要區塊號區分不同的transaction。誰來封裝transaction,即挖礦人,礦工,有對應幣種獎勵。礦工需要「解題」(容易驗證且計算複雜):比特幣是尋找符合條件的目標哈希。
  • Scala 文件 I/O
    進行文件寫操作,直接用的都是 java中 的 I/O 類 (java.io.File):import java.io.Test.scala $ scala Test$ cat test.txt 菜鳥教程從屏幕上讀取用戶輸入有時候我們需要接收用戶在屏幕輸入的指令來處理程序。
  • Linux Kernel Pwn 學習筆記(棧溢出)
    轉自看雪學院0x01 背景棧溢出是最基本的一個漏洞,學習 pwn 從棧溢出開始學習是比較簡單的入門方式。之前也研究過 linux 內核,但因為種種原因不得不放棄。現在跟著安卓版主學習了幾天linux內核漏洞,收穫了不少知識,開始自己梳理和分享自己的筆記,特此感謝版主老師的教導。