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。 使用的書籍
Js中arguments的使用、函式自呼叫、變數作用域、函式作為引數傳入、函式作為返回值
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
mybatis中sql傳入引數為集合、陣列時解決方式
平時我們寫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
35、C#學習筆記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——graph、session和op
efault constant 例如 sub 否則 我們 vector 安全 出現 graph即tf.Graph(),session即tf.Session(),很多人經常將兩者混淆,其實二者完全不是同一個東西。 graph定義了計算方式,是一些加減乘除等運算的組合,類似於
一、作用域是什麽 (學習筆記)—— 《你不知道的JavaScript》
筆記 變量 如何 都是 先來 png 模擬 特定 function 因為全部都是文字不太好理解,所以盡可能地把所有的文字都畫成了圖,便於理解。 作用域是什麽 傳統編譯流程: JavaScript 引擎會在語法分析和代碼生成階段,通過特定的步驟,對運行性能進行優化