国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Scala精華之處就在這里,拿去,面試也不怕

云計算 虛擬化
Scala作為一門面向對象的函數式編程語言,把面向對象編程與函數式編程結合起來,使得代碼更簡潔高效易于理解。這就是Scala得到青睞的初衷。

[[427956]]

本文轉載自微信公眾號「大數據左右手」,作者左右 。轉載本文請聯系大數據左右手公眾號。

前言

Scala作為一門面向對象的函數式編程語言,把面向對象編程與函數式編程結合起來,使得代碼更簡潔高效易于理解。這就是Scala得到青睞的初衷。

Scala作為一門JVM的語言,大數據生態的大部分組件都是Java語言開發的,而Scala可以與Java無縫混編,因此可以很好地融合到大數據生態圈。

主要內容

一些基礎東西不再羅列,比如開發環境,循環,異常,泛型等等,本篇只介紹獨到,特殊的精華地方,注重概念理解與用法。

1.變量和數據類型

2.函數式編程

(a)高階函數

(b)匿名函數

(c)閉包

(d)函數柯里化

3.面向對象

(a)類與對象

(b)伴生對象

(c)特質

4.模式匹配

5.隱式轉換

變量和數據類型

變量(var聲明變量,val聲明常量)

var 修飾的變量可改變

val 修飾的變量不可改變

但真的如此嗎?

對于以下的定義

  1. class A(a: Int) { 
  2.   var value = a 
  3.  
  4. class B(b: Int) { 
  5.   val value = new A(b) 

效果測試

  1. val x = new B(1) 
  2.  
  3. x = new B(1) // 錯誤,因為 x 為 val 修飾的,引用不可改變 
  4. x.value = new A(1) // 錯誤,因為 x.value 為 val 修飾的,引用不可改變 
  5.  
  6. x.value.value = 1 // 正確,x.value.value 為var 修飾的,可以重新賦值 

事實上,var 修飾的對象引用可以改變,val 修飾的則不可改變,但對象的狀態卻是可以改變的。

可變與不可變的理解

我們知道scala中的List是不可變的,Map是可變和不可變的。觀察下面的例子

var可變和List不可變的組合

  1. var list = List("左","右"
  2.  
  3. list += "手" 

理解就是

var list指向的對象是 List("左","右")

后面修改list的指向,因為是可變的var修飾,list又可以指向新的 List("左","右","手")

如果是以下(會報錯的)

  1. val list = List("左","右"
  2.  
  3. list += "手" 

val var與Map可變和不可變

  1. var map = Map( 
  2.       "左" -> 1, 
  3.       "右" ->1, 
  4.     ) 
  5. map+=("手"->1) 
  1. val map=scala.collection.mutable.Map( 
  2.   "左" -> 1, 
  3.   "右" ->1, 
  4.  
  5. map+=("手"->1) 

理解

不可變的Map在添加元素的時候,原來的Map不變,生成一個新的Map來保存原來的map+添加的元素。

可變的Map在添加元素的時候,并不用新生成一個Map,而是直接將元素添加到原來的Map中。

val不可變的只是指針,跟對象map沒有關系。

數據類型

數據類型 描述
Byte 8位有符號補碼整數。數值區間為 -128 到 127
Short 16位有符號補碼整數。數值區間為 -32768 到 32767
Int 32位有符號補碼整數。數值區間為 -2147483648 到 2147483647
Long 64位有符號補碼整數。數值區間為 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 標準的單精度浮點數
Double 64 位 IEEE 754 標準的雙精度浮點數
Char 16位無符號Unicode字符, 區間值為 U+0000 到 U+FFFF
String 字符序列
Boolean true或false
Unit 表示無值,和其他語言中void等同。用作不返回任何結果的方法的結果類型。Unit只有一個實例值,寫成()。
Null null 或空引用
Nothing Nothing類型在Scala的類層級的最底端;它是任何其他類型的子類型。
Any Any是所有其他類的超類
AnyRef AnyRef類是Scala里所有引用類(reference class)的基類

函數式編程

高階函數

高階函數是指使用其他函數作為參數、或者返回一個函數作為結果的函數。在Scala中函數是"一等公民"。

簡單例子

  1. val list=List(1,2,3,4) 
  2.  
  3. val function= (x:Int) => x*2 
  4.  
  5. val value=list.map(function

方法為函數

  1. def main(args: Array[String]): Unit = { 
  2.     val list=List(1,2,3,4) 
  3.     val value=list.map(function
  4.  
  5. def function   (x:Int)=x*2 

返回函數的函數

  1. def calculate(symbol:String): (String,String)=>String ={ 
  2.     symbol match { 
  3.       case "拼接方式1" => (a:String,b:String)=> s"拼接方式1:$a , $b" 
  4.       case "拼接方式2" => (a:String,b:String)=> s"拼接方式2: $b , $a" 
  5.     } 
  6.   } 
  1. val function: (String, String) => String = calculate("拼接方式2"
  2.  
  3. println(function("大數據""左右手")) 

匿名函數

Scala 中定義匿名函數的語法很簡單,箭頭左邊是參數列表,右邊是函數體。

使用匿名函數后,我們的代碼變得更簡潔了。

  1. var inc = (x:Int) => x+1 
  2.  
  3. var x = inc(7)-1 

也可無參數

  1. var user = () => println("大數據左右手")  

閉包

閉包是一個函數,返回值依賴于聲明在函數外部的一個或多個變量。

閉包通常來講可以簡單的認為是可以訪問一個函數里面局部變量的另外一個函數。

簡單理解就是:函數內部的變量不在其作用域時,仍然可以從外部進行訪問。

  1. val function= (x:Int) => x*2 

閉包的實質就是代碼與用到的非局部變量的混合

閉包 = 代碼 + 用到的非局部變量

  1. val fact=2 
  2. val function= (x:Int) => x*fact 

函數柯里化

柯里化指的是將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數返回一個以原有第二個參數為參數的函數。

先定義一個簡單的

  1. def add(x:Int,y:Int)=x+y 
  2.  
  3. 使用 
  4.  
  5. add(1,2) 

函數變形(這種方式就叫柯里化)

  1. def add(x:Int,y:Int)=x+y 
  2.  
  3. 使用 
  4.  
  5. add(1,2) 

實現過程

add(1)(2) 實際上是依次調用兩個普通函數(非柯里化函數)

第一次調用使用一個參數 x,返回一個函數類型的值。

第二次使用參數y調用這個函數類型的值。

  1. 接收一個x為參數,返回一個匿名函數 
  2.  
  3. 接收一個Int型參數y,函數體為x+y。 
  4.  
  5. def add(x:Int)=(y:Int)=>x+y 
  6.  
  7. (1) 
  8. val result = add(1)  // result= (y:Int)=>1+y 
  9.  
  10. (2) 
  11. val sum = result(2) 
  12.  
  13. (3) 
  14. sum=3 

面向對象

類和對象

類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用內存,而對象是具體的,占用存儲空間。類是用于創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。

類可以帶有類參數

類參數可以直接在類的主體中使用。類參數同樣可以使用var作前綴,還可以使用private、protected、override修飾。scala編譯器會收集類參數并創造出帶同樣的參數的類的主構造器。,并將類內部任何既不是字段也不是方法定義的代碼編譯至主構造器中。

  1. class Test(val a: Int, val b: Int) { 
  2.     //  

樣例類

case class一般被翻譯成樣例類,它是一種特殊的類,能夠被優化以用于模式匹配。

當一個類被聲名為case class的時候。具有以下功能:

  1. 構造器中的參數如果不被聲明為var的話,它默認的是val類型的。
  2. 自動創建伴生對象,同時在里面給我們實現子apply方法,使我們在使用的時候可以不直接使用new創建對象。
  3. 伴生對象中同樣會幫我們實現unapply方法,從而可以將case class應用于模式匹配。
  4. 實現自己的toString、hashCode、copy、equals方法
  1. case class person( 
  2.     name:String, 
  3.     age:Int 

對象與伴生對象

Scala單例對象是十分重要的,沒有像在Java一樣,有靜態類、靜態成員、靜態方法,但是Scala提供了object對象,這個object對象類似于Java的靜態類,它的成員、它的方法都默認是靜態的。

定義單例對象并不代表定義了類,因此你不可以使用它來new對象。當單例對象與某個類共享同一個名稱時,它就被稱為這個類的伴生對象。

類和它的伴生對象必須定義在同一個源文件里。類被稱為這個單例對象的伴生類。

類和它的伴生對象可以互相訪問其私有成員。

  1. object Test { 
  2.   private var name="大數據" 
  3.  
  4.   def main(args: Array[String]): Unit = { 
  5.     val test = new Test() 
  6.     println(test.update_name()) 
  7.   } 
  8.  
  9. class Test{ 
  10.   def update_name(): String ={ 
  11.     Test.name="左右手" 
  12.     Test.name 
  13.   } 
  14.  

特質(trait)

scala trait相當于java 的接口,實際上它比接口還功能強大。與接口不同的是,它還可以定義屬性和方法的實現。

一般情況下scala的類只能夠繼承單一父類,但是如果是trait 的話就可以繼承多個,從結果來看就是實現了多重繼承(關鍵字with)。其實scala trait更像java的抽象類。

  1. object Test extends UserImp with AddressImp { 
  2.   override def getUserName(): String = ??? 
  3.  
  4.   override def getAddress(): String = ??? 
  5.  
  6. trait UserImp{ 
  7.   def getUserName():String  
  8.  
  9. trait AddressImp{ 
  10.   def getAddress():String 

模式匹配

以java 的 switch 為例,java 的 switch 僅僅會做一些基本類型的匹配,然后執行一些動作,并且是沒有返回值的。

而 scala 的 pattern matching match 則要強大得多,除了可以匹配數值,同時它還能匹配類型。

  1. def calculate(symbol:String): (String,String)=>String ={ 
  2.     symbol match { 
  3.       case "拼接方式1" => (a:String,b:String)=> s"拼接方式1:$a , $b" 
  4.       case "拼接方式2" => (a:String,b:String)=> s"拼接方式2: $b , $a" 
  5.     } 
  6.   } 

讓我吃驚的是(就短短幾行)

  1. 快排 
  2.  
  3. def quickSort(list: List[Int]): List[Int] = list match { 
  4.     case Nil => Nil 
  5.     case List() => List() 
  6.     case head :: tail => 
  7.       val (leftright) = tail.partition(_ < head) 
  8.       quickSort(left) ::: head :: quickSort(right
  9.   } 
  10.    
  11. 歸并 
  12.  
  13. def merge(left: List[Int], right: List[Int]): List[Int] = (leftright) match { 
  14.     case (Nil, _) => right 
  15.     case (_, Nil) => left 
  16.     case (x :: xTail, y :: yTail) => 
  17.       if (x <= y) x :: merge(xTail, right
  18.       else y :: merge(left, yTail) 

隱式轉換

Scala提供的隱式轉換和隱式參數功能,是非常有特色的功能。是Java等編程語言所沒有的功能。它可以允許你手動指定,將某種類型的對象轉換成其他類型的對象。通過這些功能,可以實現非常強大,而且特殊的功能。

規則

(1)在使用隱式轉換之前,需要用import把隱式轉換引用到當前的作用域里或者就在作用域里定義隱式轉換。

(2)隱式轉換只能在無其他可用轉換的前提下才能操作。如果在同一作用域里,對同一源類型定義一個以上的隱式轉換函數,如果多種隱式轉換函數都可以匹配,那么編譯器將報錯,所以在使用時請移除不必要的隱式定義。

數據類型的隱式轉換

String類型是不能自動轉換為Int類型的,所以當給一個Int類型的變量或常量賦予String類型的值時編譯器將報錯。但是.....

  1. implicit def strToInt(str: String) = str.toInt 
  2. def main(args: Array[String]): Unit = { 
  3.   val a:Int="100" 
  4.    
  5.   print(a) 

參數的隱式轉換

所謂的隱式參數,指的是在函數或者方法中,定義一個用implicit修飾的參數,此時Scala會嘗試找到一個指定類型的,用implicit修飾的對象,即隱式值,并注入參數。

  1. object Test { 
  2.   private var name="大數據" 
  3.   implicit val test = new Test 
  4.  
  5.   def getName(implicit test:Test): Unit ={ 
  6.     println(test.update_name()) 
  7.   } 
  8.   def main(args: Array[String]): Unit = { 
  9.     getName 
  10.   } 
  11.  
  12. class Test{ 
  13.   def update_name(): String ={ 
  14.     Test.name="左右手" 
  15.     Test.name 
  16.   } 
  17.  

 

責任編輯:武曉燕 來源: 大數據左右手
相關推薦

2021-01-27 10:28:21

CISO升職加薪首席信息安全官

2016-06-06 17:23:50

AndroidChrome OS

2009-06-24 14:10:22

2015-10-19 12:45:02

華三

2025-10-31 14:04:32

2014-01-17 15:31:43

智能數據中心PDU

2018-12-10 07:22:27

物聯網預測分析安全威脅

2022-12-02 16:18:16

高并發架構

2017-07-26 16:15:17

Python案例入門級

2021-12-24 10:01:55

勒索團伙攻擊勒索軟件

2020-06-08 17:51:28

戴爾

2018-10-23 16:40:08

Python編程語言實用案例

2025-05-16 09:34:10

2021-07-21 18:20:25

創維

2020-11-10 14:09:48

高斯進程神經網絡高斯

2022-11-28 08:44:46

死鎖面試線程

2021-05-17 07:04:07

動態代理面試

2019-10-15 06:47:46

人工智能PythonC

2021-01-13 15:02:40

戴爾

2017-09-01 21:48:50

戴爾
點贊
收藏

51CTO技術棧公眾號

欧美亚洲色图视频| 成人影院在线观看视频| 在线欧美激情| 欧美精三区欧美精三区| 最近免费中文字幕中文高清百度| 亚洲国产第一| 91成品人片a无限观看| 国产精品专区免费| 欧美日韩国产一区二区三区| 免费无码毛片一区二三区| 国产精品久久国产愉拍| 欧美中文字幕在线观看| 欧美videos粗暴| 日韩欧美高清一区| 日本不卡免费播放| 一区二区三区在线播| 日韩精品视频久久| 国产在线一区观看| 日本精品一区二区三区不卡无字幕| 久久国产成人精品| 茄子视频成人在线| 国产美女精品视频免费播放软件| 日韩av在线网站| caopo在线| 欧美日韩国产成人在线91| 午夜成在线www| 亚洲欧美另类久久久精品| 欧美牲交a欧美牲交aⅴ免费下载| 久久国产精品第一页| 欧美极品美女视频| 亚洲国产小视频在线观看| 成年网站在线| 五月天一区二区三区| 国产黄色免费网| 中文字幕巨乱亚洲| 日韩不卡一二三| 中文字幕乱码久久午夜不卡| 欧美女人性生活视频| 不卡一区二区在线| 国产视频九色蝌蚪| 久久久久久日产精品| 国产欧美高清在线| 欧美国产一区在线| av在线影视| 亚洲国产成人精品视频| av天天在线| 亚洲成人一区二区在线观看| 福利资源在线久| 婷婷成人激情在线网| 日韩国产福利| 欧美精品亚洲一区二区在线播放| 美女黄视频在线观看| 精品乱码亚洲一区二区不卡| 亚洲欧美韩国| 欧美大片免费看| 国产伦精品一区二区三区视频| 国产伊人精品在线| 在线看片日韩| 天堂va久久久噜噜噜久久va| 狠狠色狠狠色综合日日91app| 成人性生活视频免费看| 日韩五码电影| eeuss鲁片一区二区三区在线观看| 国产精品av免费观看| 成人手机电影网| 五月婷婷丁香色| 天天免费综合色| 尤物yw193can在线观看| 中文字幕欧美亚洲| 亚洲丝袜啪啪| 国产欧美一区二区三区另类精品| 麻豆免费精品视频| 老司机午夜av| 色综合久久天天综合网| 波多野在线观看| 欧美高清视频在线| 国产精品久久久久久久久妇女| 久久久久久高清| 国产电影一区二区三区| 二区三区中文字幕| 欧美一区二区福利在线| 亚洲日本中文| 日本久久精品一区二区| 成人国产精品久久| 欧美成人欧美edvon| 午夜视频一区二区在线观看| 久久综合给合久久狠狠色| 国产盗摄女厕一区二区三区| 嫩草在线视频| 国产精品久久精品国产| 成人免费看视频| 婷婷丁香在线| 一区二区三区欧美成人| 亚洲欧美一区二区三区国产精品| 免费av不卡在线观看| 99在线欧洲视频| 亚洲自拍高清视频网站| 久久久久久久网| 国产免费一区| 国产在线国偷精品产拍免费yy| 天天爱天天操天天干| 精品久久在线播放| 东京一区二区| 国产成人一区二区| 乱一区二区av| 116极品美女视频在线观看| 欧美日本一区二区在线观看| 成人免费毛片嘿嘿连载视频…| 国产精品igao视频| 国产一区二区三区美女| 在线免费色视频| 一本一道久久a久久精品逆3p| 91亚洲自偷观看高清| 佐佐木明希av| 午夜婷婷国产麻豆精品| 日本久久久久| 欧美激情导航| 亚洲v中文字幕| 视频欧美精品| 欧美人与物videos另类| 成人欧美一区二区三区| 国模冰冰炮一区二区| 91久久国产婷婷一区二区| 成人综合婷婷国产精品久久蜜臀 | www.在线观看av| 欧美日韩一区二区三区| 视频欧美精品| 日韩欧美在线一区二区| 欧美视频一区二区三区…| 99国产精品久久一区二区三区| 一本久道久久综合狠狠爱亚洲精品| 第一福利永久视频精品 | 一本久道久久综合中文字幕| 日本少妇精品亚洲第一区| 亚洲欧洲三级| 欧美专区亚洲专区| 国产一区二区三区四区大秀| 国产一区二区网| 亚洲成av人片在线观看香蕉| 日韩五码在线| 蜜月aⅴ免费一区二区三区| 亚洲精品国精品久久99热一| 久久久亚洲精品石原莉奈| 国色天香久久精品国产一区| yw193.com尤物在线| 欧美国产日本在线| 粉嫩13p一区二区三区| av在线免费网站| 99影视tv| 亚洲一二三四久久| 伊人成综合网yiren22| 国产wwwxx| 九色精品美女在线| 久久免费视频一区| 欧美a在线观看| 免费日韩视频在线观看| 在线日韩第一页| 成人免费高清视频在线观看| 欧美大片免费高清观看| 在线看视频不卡| 日韩精品在线观看网站| 久久精品国产99国产| 在线免费看h| 国产精品网站免费| 欧美区在线播放| 一区精品在线播放| 日本不卡高清| 成人在线观看免费| 日本高清不卡三区| 精品爽片免费看久久| 91一区二区在线| 欧美理论电影在线精品| 国产精品精华液网站| 97视频资源在线观看| 欧美高清视频一二三区| 免费成人在线观看视频| 91p九色成人| 亚洲欧美在线精品| 国产精品永久在线| 欧美日韩中字一区| 日本aⅴ免费视频一区二区三区| 美女av在线免费看| 最近免费中文字幕中文高清百度| 欧美在线视频免费播放| 色综合色狠狠天天综合色| 先锋a资源在线看亚洲| 激情开心成人网| 成人观看视频| 国产一区二区三区奇米久涩| 精品爽片免费看久久| 国产无一区二区| 天天操夜夜操国产精品| 羞羞网站在线看| aa免费在线观看| 成人av在线亚洲| 亚洲第一二三四五区| 久久久国产综合精品女国产盗摄| 91视频一区| 成人性生活视频| 日本视频二区|