1. 程式人生 > >scala中的函式、變數、集合、物件---scala學習筆記(1)

scala中的函式、變數、集合、物件---scala學習筆記(1)

最近正在嘗試接觸spark,那麼不可避免地就要用到scala,雖然spark同時也支援java,但是通過閱讀spark上的例程上發現,往往scala的程式碼相比較java而言更加簡短,而且也更加清晰。所以決定試一試簡單地學習一下scala。
使用的書籍是《Scala程式設計》,篇幅不長但是力在突出Scala自身的特性而且對Java和scala做了比較。
1.變數的定義
scala一共就兩種變數,一種是var,另一種是val。前者在生命週期中可以被賦值多次,後者在初始化之後便不可再被賦值。val類似於Java中的final型變數。看起來是特殊的變數,但是在函數語言程式設計中常使用的是val而非var。儘量少使用var可以使得程式碼更加簡潔。
2.函式的定義

def max(x:Int,y:Int):Int={
    if(x>y)
        x
    else
        y
}

例如上面定義的一個函式,引數類表中冒號後面的是引數型別,引數列表後面緊跟著的冒號提示的是函式的返回型別。如果函式不返回任何有用的值,那麼使用關鍵字Unit,或者直接不寫冒號和之後的型別也可以:

def p()=println("Hello")

3.函式文字
Scala函式文字語法:

(x:Int,y:Int)=>x+y

右鍵頭之前的是引數列表,箭頭之後是函式體。又例如下面的語句可以列印每一行命令列引數:

args.foreach
(arg=>println(arg))

也可以用for語句寫成這樣:

args.for(arg<-args)
    println(arg)

注意變數arg是val型別的,不能在for的迴圈體中被重新賦值。
4.持有物件

  • Array

    可以用如下方法定義一個String型別的陣列:

val str=new Array[String](2)

[]中的是資料型別,而()括號內的是定義長度
如果要對字串賦值:

str(0)="Hello World"
str(1)="!!\n"

如果要區域性遍歷Array:

for(i<-0 to 2)
    print(str(i)
)

其中Scala吧’0’和’2’都看成物件,所以中間的to其實是物件(0)呼叫的方法,語句也可以寫成

for(i<-(0).to(2))
    print(str(i))

類似地其他運算子如’+’,’-‘實際上都是方法的呼叫
對於陣列的初始化:

val numbers=Array(1,2,3)
  • List
    和Java中不一樣的是Scala中的List不可變長的,沒有append方法。
    有兩種疊加的方法:
    第一種是’:::’,可以將兩個List相互疊加:
val ListA=List(1,2)
val ListB=List(3,4)
val ListAB=ListA:::ListB

ListAB得到的就是ListA和ListB合併的新List
第二種是’::’,可以把新元素新增到List的最前端:

val ListC=(2,3)
val ListD=1::ListC

ListD的元素就是(1,2,3)
可以用var定義List做到類似append的效果

    var listA=List(2,3,4)
    listA=1::listA

最後將List呼叫reverse即可。
ListBuffer有append方法,最後呼叫toList()方法就可以轉換成List了。

  • Set

    Set分為兩種,一種是可變集,另一種是不可變集。兩個都命名為Set,但是在兩個不同的包下。
    scala.collection.mutable.Set和scala.collection.immutable.Set
    可變集加入新元素後直接返回自身,而不可變集加入新元素後會返回一個新構造出來的集合,那個集合加入了新的元素,自身並沒有新增。

  • Tuple
    由於List和Array以及後面的Set儲存的資料型別是不能改變的,所以有了Tuple,元組。其中可以同時擁有多種型別的元素
    例如可以直接這麼定義和執行:
val tuples=(1,"train")
print(tuples._1)
print(tuples._2)
  • Map
    和Set一樣,Map也分為可變對映和不可變對映,同樣也是相同的命名,在不同包下。
    例如創造一個可變對映:
import scala.collection.mutable.Map
val CapitalMap=Map[String,String]()
CapitalMap+=CapitalMap("China"->"Beijing")
CapitalMap+=CapitalMap("United States"->"Washington")
CapitalMap+=CapitalMap("France"->"Paris")

新增新的對映時都是對自己重新賦值
如果用不可變對映:

val CapitalMap=Map{
"China"->"Beijing",
"United States"->"Washington",
"France"->"Paris"
}

5.類和物件

  • 類的定義

Scala類和物件的概念與Java類似,如看到如下類:

class packet{
   var money=0
   def earn(cash:Int){money+=cash}
   def cost(cash:Int){money-=cash}
}

如果有兩次例項化:

val a=new packet
val b=new packet

在未對money進行再次賦值之前,兩者指向的是同一個變數money.
注意,a是val型別的,則不可再次指向新的物件,但是可以改變其指向物件的欄位money。
Scala中的預設訪問許可權是public

  • 分號的推斷規則:

    分號推斷的規則
    分割語句的精確規則非常有效卻出人意料的簡單。那就是,除非以下情況的一種成立,
    否則行尾被認為是一個分號:
    1.疑問行由一個不能合法作為語句結尾的字結束,如句點或中綴操作符。
    2.下一行開始於不能作為語句開始的字。
    3.行結束於括號 (…) 或方框 […] 內部,因為這些符號不可能容納多個語句。


這裡引用書中的原話。
  • 單例物件
    Scala特有的單例物件集成了同名類的所有靜態成員,因為在Scala類中沒有定義靜態成員的手段。
    使用關鍵字Object建立單例物件:
Object packet{
 var master="KATE"
 def setName(temp:String){master=KATE}
}

單例物件也被稱作是同名類的伴生物件。
不依附於任何類的單例物件稱為孤立物件。
值得一提的是在寫Scala程式時的程式入口點定義就可以用到孤立物件。

剛剛才開始學習scala,發現要開始在spark上寫還是很有難度的啊,最多也是讀懂一些例子,也不能深入到去寫演算法。

相關推薦

scala函式變數集合物件---scala學習筆記(1)

最近正在嘗試接觸spark,那麼不可避免地就要用到scala,雖然spark同時也支援java,但是通過閱讀spark上的例程上發現,往往scala的程式碼相比較java而言更加簡短,而且也更加清晰。所以決定試一試簡單地學習一下scala。 使用的書籍

Jsarguments的使用函式自呼叫變數作用域函式作為引數傳入函式作為返回值

1,arguments是一個比較特別的物件,每個函式中都有一個arguments,它接收函式傳入的引數,以陣列的形式存放在 arguments,可遍歷 //1,需求:求任意數的最大值 function getMax(){ var Max = arguments

Python函式的定義匿名函式函式的引數函式呼叫引數傳遞變數作用域遞迴呼叫

Python函式: 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 Python提供了許多內建函式,比如print()。你也可以自己建立函式,這被叫做使用者自定義函式。 定義函式: 在Python中,定義一個函式要使用def語句,依次寫出函式名、

引用資料型別函式變數提聲棧堆

引用資料型別函式 1.通過建構函式new Function()  不論有木有給函式取名  函式的name均為anonymous 2.特例; function f1() {}; var f2=f1.bind(null); console.log(f2.name);//"b

mybatissql傳入引數為集合陣列時解決方式

平時我們寫sql時只需要傳入一個查詢引數或者幾個不同欄位的引數就足夠了,但是如果傳入的引數是集合、陣列的時候該怎麼辦呢? mybatis中的<foreach>標籤很好的提供了對這類問題的解

JVM (三)--記憶體模型變數可見性指令重排記憶體屏障

Java記憶體模型 Java記憶體模型(JMM):Java定義的一中抽象規範,用來遮蔽不同硬體和作業系統的記憶體訪問差異,讓Java程式在不同平臺下都能達到一致的記憶體訪問效果。 Java記憶體圖示: 1、主記憶體:執行緒共享記憶體,執行緒讀寫訪問較慢; 包括方法區和Jav

【shell】1變數的宣告引用及作用域

shell程式 以檔案形式存放==批量的Linux命令集合==,該檔案能夠被Shell解釋執行,這種檔案就是Shell指令碼程式 通常由一段Liunx命令、Shell命令、控制語句以及註釋語句構成 Shell指令碼的編寫 Shell指令碼是純文字檔案,可以使用任何文字編輯器編寫

吳恩達-機器學習筆記(1)-模型表示損失函式梯度下降

無監督學習:一個程式被認為能從經驗E中學習,解決任務T,達到效能度量值P,當且僅當,有了經驗E,經過P的評判,程式在處理T時效能有所提升。 A computer program is said to learn from experience E with respect to some t

C#泛型入門學習泛型類泛型集合泛型方法泛型約束泛型委託

本章閱讀列表 泛型很難理解?不然 泛型集合和ArrayList的裝箱拆箱 常見的泛型型別 泛型類和泛型方法 泛型約束 泛型委託 泛型很難理解?不然 在接觸的一個新的概念的時候,總會感覺難以理解,當你掌握並能熟練地使用的時候,發現這個概念其實簡單的,我相信

C++變數(C++變數定義變數賦值命名規則)

其實在前面的例子中已經多次用到了變數。在程式執行期間其值可以改變的量稱為變數。一個變數應該有一個名字,並在記憶體中佔據一定的儲存單元,在該儲存單元中存放變數的值。請注意區分變數名和變數值這兩個不同的概念,見圖2.6。 圖2.6 變數名規則 先介紹識別符號的概念。和其他高階語言一樣,用來標識變數、符號常量、

Ng深度學習筆記 1-線性迴歸監督學習成本函式梯度下降

他講了監督學習的兩類問題,分類和迴歸,並引入了兩個例子。一個講用現有的房屋面積和房價的資料集推算任意房子的價格(可認為是連續的),然後再引入其他模型引數,比如臥室個數等。另一個講用腫瘤的大小來推斷是否為良性或惡性腫瘤,如果引入其他引數,比如腫瘤細胞大小的一致

JavaScript var關鍵字變數的狀態異常處理命名規範等介紹

  本篇主要介紹var關鍵字、變數的undefined和null狀態、異常處理、命名規範。 目錄 1. var 關鍵字:介紹var關鍵字的使用。 2. 變數的狀態:介紹變數的未定義、已定義未賦值、已定義已賦值 三種狀態。 3. JS異常:介紹對JS異常的處理。 4. 命名規範:介紹Js的基本命名規範

集合泛型集合字典雜湊表 總結

一:ArrayList集合 1.  必須宣告名稱空間 usingsystem.collection 2.  可用與儲存不同型別的資料 3.  讀取資料時大都需要里氏轉換 4.  常用方法

java for foreach 和 迭代器 的學習筆記

開發十年,就只剩下這套架構體系了! >>>   

Linux學習筆記1-CentOS7不能聯網關閉防火墻

rest attr network key 重啟 -s 筆記 aid com 在使用虛擬機安裝完CentOS7後是不能上網的,需要做以下設置: 1、將虛擬機的網絡設置為橋接模式 2、修改文件 /etc/sysconfig/network-scripts下的ifcfg-enp

35C#學習筆記1

c#C#語言是一種面向對象的編程語言,主要用於開發運行在.net虛擬機上面的應用程序。C#語言的特點:1、語法簡潔,不允許直接操作內存,去掉了指針操作。2、徹底的面向對象設計,C#具有面向對象語言所應有的一切特性:封裝、繼承、多態。3、與web緊密結合,並且支持絕大多數的web標準。如:HTML、XML、SO

學習筆記1(三元運算深淺拷貝動態參數全局變量與局部變量set數據類型 )

img class blog war post 所有 註意 學習 gpo (三元運算、深淺拷貝、動態參數、全局變量與局部變量、set數據類型 ) set 數據類型--無序,不重復的集合 一.三元運算、三木運算--減少代碼量 name=“X1”if 條件 else “x2”

模塊類和對象(python學習筆記

python 類 模塊 對象 模塊、類和對象 1.字典,記住鍵值對的概念,記住從鍵值對 mystuff = {‘apple‘:"I am apples"} print mystuff[‘apple‘] 2.模塊 ‘‘‘ 模塊 1.模塊是包含函數和變量的文件 2.模塊這個

斯坦福CS20SI TensorFlow學習筆記1——graphsession和op

efault constant 例如 sub 否則 我們 vector 安全 出現 graph即tf.Graph(),session即tf.Session(),很多人經常將兩者混淆,其實二者完全不是同一個東西。 graph定義了計算方式,是一些加減乘除等運算的組合,類似於

作用域是什麽 (學習筆記)—— 《你不知道的JavaScript》

筆記 變量 如何 都是 先來 png 模擬 特定 function 因為全部都是文字不太好理解,所以盡可能地把所有的文字都畫成了圖,便於理解。 作用域是什麽 傳統編譯流程: JavaScript 引擎會在語法分析和代碼生成階段,通過特定的步驟,對運行性能進行優化