從零開始學習Spark(五)Scala進階

Scala進階

在后面的文章中声登,會涉及到一些Scala中我們還沒有接觸到的語法浙滤。這篇Scala進階會在Scala基礎上更進一步腾誉,完成對Scala語言特性的整體學習贵少。

1. 閉包

看下面這個例子,multiplier函數的輸出值不僅取決于輸入參數i铆惑,還與變量factor相關范嘱,而factor是聲明在函數外的。

有趣的是员魏,函數可以對這個這個factor進行修改丑蛤,仿佛factor是這個函數的一個私有變量。這就是閉包撕阎。

object Test {
    def multiplier (i: Int): Int = {
        factor = factor + 1
        return i * factor
    }

    var factor: Int = 6

    def main(args: Array[String]) {
        println(multiplier(1))
        println(multiplier(1))
    }
}

輸出結果:

7
8

2. 字符串

Scala字符串使用的直接是java.lang.String受裹,因此和Java的使用方法基本一致。

用幾個例子就可以說明使用方法了闻书。

// 創(chuàng)建字符串
val greeting: String = "Hello World"
//  String 對象是不可變的
// 如果你需要創(chuàng)建一個可以修改的字符串名斟,可以使用 String Builder 類
val buf = new StringBuilder;
buf += 'a'
buf ++= "bcdef"
println( "buf is : " + buf.toString );
// 字符串長度
var len = palindrome.length();
// 字符串連接
"菜鳥教程官網: ".concat("www.runoob.com");
"菜鳥教程官網: " + ("www.runoob.com");
// 格式化輸出
var fs = printf("浮點型變量為 " +
       "%f, 整型變量為 %d, 字符串為 " +
       " %s", floatVar, intVar, stringVar)

3. 數組Array

數組是Array脑慧,Array的特點是長度固定魄眉,元素可變,可以先定義后賦值

一維數組的創(chuàng)建方法闷袒,有三種

var z:Array[String] = new Array[String](3)
var z = new Array[String](3)
z(0) = "Runoob"; z(1) = "Baidu"; z(2) = "Google"
var z = Array("Runoob", "Baidu", "Google")

遍歷數組

for ( x <- myList ) {
  println( x )
}

合并數組

var myList3 =  concat( myList1, myList2)

用range來創(chuàng)建區(qū)間數組

import Array._
for (x <- range(1,10,2)) {
  println(x)
}

多維數組的定義及使用

import Array._
var myMatrix = ofDim[Int](3,3)

for (i <- 0 to 2; j <- 0 to 2) {
  myMatrix(i)(j) = j;
}

4. Collections

Scala的集合包括以下五種

列表List

Scala 列表類似于數組坑律,它們所有元素的類型都相同,但是它們也有所不同:列表是不可變的囊骤,值一旦被定義了就不能改變晃择。

val nums: List[Int] = List(1, 2, 3, 4)
val nums = List(1, 2, 3, 4)
// 構造列表的兩個基本單位是 Nil 和 ::
// Nil 也可以表示為一個空列表。
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

集合Set

Scala Set(集合)是沒有重復的對象集合也物,所有的元素都是唯一的宫屠。Scala 集合分為可變的和不可變的集合。默認情況下滑蚯,Scala 使用的是不可變集合浪蹂〉终唬可變需要引入包。

val set:Set[Int] = Set(1,2,3)
val set = Set(1,2,3)

哈希表Map

Map(映射)是一種可迭代的鍵值對(key/value)結構坤次。所有的值都可以通過鍵來獲取古劲。Map 中的鍵都是唯一的。默認情況下 Scala 使用不可變 Map缰猴〔可變需要引入包。

var A:Map[Char,Int] = Map()
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
// 添加元素
A += ('I' -> 1)
A += ('J' -> 5)
A += ('K' -> 10)
// 訪問元素
A('I')

元組Tuple

與列表一樣滑绒,元組也是不可變的闷堡,但與列表不同的是元組可以包含不同類型的元素。

val t = (1, 3.14, "Fred") 
// 注意最多到Tuple22
val t = new Tuple3(1, 3.14, "Fred")

我們可以使用 t._1 訪問第一個元素疑故, t._2 訪問第二個元素

選項Option

Scala Option(選項)類型用來表示一個值是可選的(有值或無值)缚窿。

Option[T] 是一個類型為 T 的可選值的容器: 如果值存在, Option[T] 就是一個 Some[T] 焰扳,如果不存在倦零, Option[T] 就是對象 None

val a:Option[Int] = Some(5)
val b:Option[Int] = None 

比如Map的get方法返回的就是Option對象

val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
 
println(value1) // Some("value1")
println(value2) // None

5. 迭代器Iterator

Scala Iterator(迭代器)不是一個集合,它是一種用于訪問集合的方法吨悍。

迭代器 it 的兩個基本操作是 next 和 hasNext扫茅。調用 it.next() 會返回迭代器的下一個元素,并且更新迭代器的狀態(tài)育瓜。調用 it.hasNext() 用于檢測集合中是否還有元素葫隙。

val it = Iterator("Baidu", "Google", "Runoob", "Taobao")
while (it.hasNext){
  println(it.next())
}
// 獲取最值
println("最大元素是:" + ita.max )
println("最小元素是:" + itb.min )
// 獲取長度
println("ita.size 的值: " + ita.size )
println("itb.length 的值: " + itb.length )

6. 類和對象

直接用一個例子體會一下就好了,語法和Java只有微小的區(qū)別

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐標點 : " + x);
      println ("y 的坐標點 : " + y);
   }
}

class Location(xc: Int, yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("x 的坐標點 : " + x);
      println ("y 的坐標點 : " + y);
      println ("z 的坐標點 : " + z);
   }
}

object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

      // 移到一個新的位置
      loc.move(10, 10, 5);
   }
}
  • Scala重寫一個非抽象方法躏仇,必須用override修飾符恋脚。例子里面的move方法參數不同,算是重載了焰手,所以不需要override糟描。

Scala 單例對象:Scala有個非常簡便的創(chuàng)建單例模式對象的關鍵詞object,可以實現(xiàn)類似Java下單例代碼的功能书妻,object對象不能帶有參數船响,寫法如下

object Point {
   var x: Int = 1
   var y: Int = 2
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐標點 : " + x);
      println ("y 的坐標點 : " + y);
   }
}

object Test {
   def main(args: Array[String]) {
      println(Point.x)
      Point.move(2,3)
   }
}

Java單例模式寫法

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
    public static Singleton getInstance() {
     if (instance == null) {
         instance = new Singleton();
     }
     return instance;
    }
}

伴生對象,與類共享名字躲履,可以訪問類的私有屬性和方法

7. 特征Trait

Scala Trait(特征) 相當于 Java 的接口见间,實際上它比接口還功能強大。與接口不同的是工猜,它還可以定義屬性和方法的實現(xiàn)米诉。

一般情況下Scala的類只能夠繼承單一父類,但是如果是 Trait(特征) 的話就可以繼承多個篷帅,從結果來看就是實現(xiàn)了多重繼承史侣。

trait Equal {
    def isEqual(x: Any): Boolean
    def isNotEqual(x: Any): Boolean = !isEqual(x)
}

當需要繼承一個類汗销,擴展多個trait時,這樣寫

class Location(xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc) with Equal

8. 模式匹配

模式匹配和C及Java中的switch有點類似抵窒,但是Scala的模式匹配更為強大弛针,可以匹配不同數據類型。

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

輸出結果為:

2
many
one
scala.Int

補充:使用了case關鍵字的類定義就是就是樣例類(case classes)李皇,樣例類是種特殊的類削茁,經過優(yōu)化以用于模式匹配。

9. 異常處理

拋出異常

throw new IllegalArgumentException

捕獲異常

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException

object Test {
   def main(args: Array[String]) {
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException => {
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      } finally {
         println("Exiting finally...")
      }
   }
}

執(zhí)行結果為

Missing file exception
Exiting finally...

10. 提取器

Scala 提取器是一個帶有unapply方法的對象掉房。unapply方法算是apply方法的反向操作:unapply接受一個對象茧跋,然后從對象中提取值,提取的值通常是用來構造該對象的值卓囚。

11. 文件I/O

寫文件

import java.io._

object Test {
   def main(args: Array[String]) {
      val writer = new PrintWriter(new File("test.txt" ))

      writer.write("菜鳥教程")
      writer.close()
   }
}

讀取輸入

object Test {
   def main(args: Array[String]) {
      print("請輸入菜鳥教程官網 : " )
      val line = Console.readLine
      
      println("謝謝瘾杭,你輸入的是: " + line)
   }
}

讀文件

import scala.io.Source

object Test {
   def main(args: Array[String]) {
      println("文件內容為:" )

      Source.fromFile("test.txt" ).foreach{ 
         print 
      }
   }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哪亿,隨后出現(xiàn)的幾起案子粥烁,更是在濱河造成了極大的恐慌,老刑警劉巖蝇棉,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讨阻,死亡現(xiàn)場離奇詭異,居然都是意外死亡篡殷,警方通過查閱死者的電腦和手機钝吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來板辽,“玉大人奇瘦,你說我怎么就攤上這事【⑾遥” “怎么了耳标?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓶您。 經常有香客問我麻捻,道長纲仍,這世上最難降的妖魔是什么呀袱? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮郑叠,結果婚禮上夜赵,老公的妹妹穿的比我還像新娘。我一直安慰自己乡革,他們只是感情好寇僧,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布摊腋。 她就那樣靜靜地躺著,像睡著了一般嘁傀。 火紅的嫁衣襯著肌膚如雪兴蒸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天细办,我揣著相機與錄音橙凳,去河邊找鬼。 笑死笑撞,一個胖子當著我的面吹牛岛啸,可吹牛的內容都是我干的。 我是一名探鬼主播茴肥,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼坚踩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓤狐?” 一聲冷哼從身側響起瞬铸,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎础锐,沒想到半個月后赴捞,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡郁稍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年赦政,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耀怜。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡恢着,死狀恐怖,靈堂內的尸體忽然破棺而出财破,到底是詐尸還是另有隱情掰派,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布左痢,位于F島的核電站靡羡,受9級特大地震影響,放射性物質發(fā)生泄漏俊性。R本人自食惡果不足惜略步,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望定页。 院中可真熱鬧趟薄,春花似錦、人聲如沸典徊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至羡铲,卻和暖如春蜂桶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背也切。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工屎飘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贾费。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓钦购,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褂萧。 傳聞我的和親對象是個殘疾皇子押桃,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • 這篇講義只講scala的簡單使用,目的是使各位新來的同事能夠首先看懂程序导犹,因為 scala 有的語法對于之前使用習...
    MrRobot閱讀 2,917評論 0 10
  • scala學習筆記 第2章 變量和數據類型 基本數據 scala的核心數據為四種 :字面量唱凯、值、變量谎痢、類型 值使...
    485b1aca799e閱讀 2,130評論 0 1
  • 愿天下所有用心教書育人的老師們,節(jié)日快樂滨嘱,您辛苦了峰鄙!好吧,接下來讓你們看看太雨,什么叫做別人的老師吟榴! 記得某一年的教師...
    waitine閱讀 658評論 2 4
  • 感覺是久未進食,只管一路行尸走肉囊扳,最后弄得自己渾身不是吩翻,極度缺乏營養(yǎng)。
    子悅zy閱讀 227評論 0 0