[scala-spark]3. 变量 数据类型 分支与循环
1. 變量定義與初始化
package com.lineshen.chapter2object variable {def main(args: Array[String]): Unit = {val age: Int = 10val sal: Double = 10.9val name: String = "lienshen"val isPass: Boolean = trueval score: Float = 99.55fprintln(s"${name} ${age} ${score} ${sal}")} }變量類型可以寫可以不寫,與golang不同的是,定義類型用 [:type];
當然,scala支持變量類型的推導;
變量申請時,請注意初始化,這一點與java很不同;
val修飾的變量編譯之后等于加上了final,保證線程安全;
類型判斷與Java一樣用 variableName.theInstanceof[variableType];
2.數據類型
Scala與Java有著相同的數據類型,在Scala中數據類型都是對象,也就是說Scala沒有java中的原生類型。
Scala的數據類型分為兩大類:AnyVal(值類型)和AnyRef(引用類型),注意:不管是AnyVal還是AnyRef都是對象。因此,他有大量的方法可以直接調用。
package com.lineshen.chapter2object removePara {def main(args: Array[String]): Unit = {sayHi()sayHi}def sayHi() : Unit ={println("Hi, scala")} }>>Hi, scala >>Hi, scala當函數沒有形參時,函數的調用可以免去括號(),真的很神奇!
小結:
1. 在Scala中有一個根類Any,是所有數據類型的父類
2. Null類型是scala的特別數據類型,只有一個值null;他是bottom class,是所有anyRef類型的子類
3. Nothing類型也是bottom class,它是所有數據類型對應類的子類,一般拋出異常時最常使用。
4. Scala中低精度向高精度的值自動隱式轉換
5.?Unit表示無值,與其它語言中的void 等同,用作不反悔任何結果的方法的結果類型。Unit只是一個實例值,寫成();
package com.lineshen.chapter2object nothingCTest {def main(args: Array[String]): Unit = {sayHello}// 異常中斷:即當我們nothing作為返回值,就明確說明該方法沒有正常返回值def sayHello() :Nothing = {throw new Exception("拋出異常")} } val floatVal : Float = 1.1 // 錯誤:Double無法向Float轉換 val doubleVal = 1.2f //正確:Float可以向Double轉換3. 基本數據類型與String之間的轉換
// 基本數據類型 -> String val temp :Int = 1024 val str = temp + "" // String -> 基本數據類型 str.toInt() str.toFloat() str.toDouble() str.toByte()4. 分支與循環
package com.lineshen.chapter4import scala.io.StdInobject ifelseDemo {def main(args: Array[String]): Unit = {println("your name:")val name = StdIn.readLine()if (name == "lienshen")println("hello " + name)elseprintln("you are " + name)} }在scala中沒有swich多分支設計,采用模板match-case,功能十分強大。
關于for循環,變動很大,成為for推導式。
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {for(i <- 1 to 5) {println("hello, Tsinghua University " + i)} } } package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")for (i <- list) {println(i)}} }循環守衛,也叫循環保護式。類似于continue,不過scala把continue干掉了(實質是把for循環與判斷偶合在了一起,簡化代碼)
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")for (i <- list if i == "lineshen") {println(i)}} }for引入新變量(實質是for循環與遍歷變量的耦合)
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")for (i <- list; j = i + " i love you") {println(j)}} }for簡化循環嵌套(實質是簡畫代碼長度,但是不好寫業務邏輯)
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list_i = List("hello", "tsinghua", "hello", "lineshen")val list_j = List(" happy")for (i <- list_i; j <- list_j) {println(i+j)}} }for循環返回值yield (遍歷過程中把結果保存在Vector中,并返回到變量中);主要用于集合中的數據單元處理
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")val res = for (i <- list) yield iprintln(res)} } package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")val res = for (i <- list) yield if (i == "lineshen") i + " happy"println(res)} }>> List((), (), (), lineshen happy)for循環的步長控制(可以用守衛,可以用range)
package com.lineshen.chapter4object forDemo {def main(args: Array[String]): Unit = {// 支持對集合的遍歷,和for range很像val list = List("hello", "tsinghua", "hello", "lineshen")val res = for (i <- Range(0,3,2)) yield list(i)println(res)} }>> Vector(hello, hello)for循環不支持break關鍵字,同樣采用循環守衛進行處理。
Scala提供了while循環,但是不支持采用while循環。
總結
以上是生活随笔為你收集整理的[scala-spark]3. 变量 数据类型 分支与循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的第一个*.SYS
- 下一篇: [scala-spark]4. 函数式编