18715858593

軟件開發 網站建設 平台運營

NEWS/信息資訊

您當前位置>主頁 > 信息資訊 > 技術資訊 >

鸭脖app

發表時間:2020-03-31 19:15

文章來源:admin

浏覽次數:

聲明變量

Java變量定義

int a = 0;

在scala中,可以使用val或者var來定義變量,語法格式如下:

val/var 變量标識:變量類型 = 初始值

其中

val定義的是不可重新賦值的變量

var定義的是可重新賦值的變量

scala中定義變量類型寫在變量名後面

scala的語句最後不需要添加分号

定義一個變量

示例:定義一個變量保存一個人的名字"tom"

參考代碼

scala> val name:String = "tom"

name: String = tom

val和var變量

示例

給名字變量進行重新賦值為Jim,觀察其運行結果

參考代碼

scala> name = "Jim"


      name = "Jim"

示例

使用var重新定義變量來保存名字"tom",并嘗試重新賦值為Jim,觀察其運行結果

參考代碼

scala> var name:String = "tom"

name: String = tom

scala> name = "Jim"

name: String = Jim

類型推斷定義變量

scala的語法要比Java簡潔,我們可以使用一種更簡潔的方式來定義變量。

示例

使用更簡潔的語法定義一個變量保存一個人的名字"tom"

參考代碼

scala> val name = "tom"

name: String = tom

scala可以自動根據變量的值來自動推斷變量的類型,這樣編寫代碼更加簡潔。

惰性賦值

在企業的大數據開發中,有時候會編寫非常複雜的SQL語句,這些SQL語句可能有幾百行甚至上千行。這些SQL語句,如果直接加載到JVM中,會有很大的内存開銷。如何解決?

當有一些變量保存的數據較大時,但是不需要馬上加載到JVM内存。可以使用惰性賦值來提高效率。

語法格式:

lazy val  變量名 = 表達式

參考代碼

scala> lazy val sql = """insert overwrite table adm.itcast_adm_personas

    |     select

    |     a.user_id,

....

    |     left join gdm.itcast_gdm_user_buy_category c on a.user_id=c.user_id

    |     left join gdm.itcast_gdm_user_visit d on a.user_id=d.user_id;"""

sql: String =

字符串

scala提供多種定義字符串的方式,将來我們可以根據需要來選擇最方便的定義方式。

使用雙引号

使用插值表達式

使用三引号

使用雙引号

語法

val/var 變量名 = “字符串”

參考代碼

val name="hadoop6"

scala> println(name + name.length)

hadoop6

使用插值表達式

插值表達式可以有效避免大量字符串的拼接。

語法

val/var 變量名 = s"${變量/表達式}字符串"

在定義字符串之前添加s

在字符串中,可以使用${}來引用變量或者編寫表達式

示例

若幹個變量,分别保存:"zhangsan"、30、"male",定義一個字符串,保存這些信息。

打印輸出:name=zhangsan, age=30, sex=male

參考代碼

scala> val name = "zhangsan"

name: String = zhangsan

scala> val age = 30

age: Int = 30

scala> val sex = "male"

sex: String = male

scala> val info = s"name=${name}, age=${age}, sex=${sex}"

info: String = name=zhangsan, age=30, sex=male

scala> println(info)

name=zhangsan, age=30, sex=male

使用三引号

大段的文本需要保存,可以使用三引号來定義字符串。例如:保存一大段的SQL語句。三個引号中間的所有字符串都将作為字符串的值。

語法

val/var 變量名 = """字符串1

字符串2"""

參考代碼

val sql = """select

    | *

    | from

    |     t_user

    | where

    |     name = "zhangsan""""

println(sql)

數據類型與操作符

scala中的類型以及操作符絕大多數和Java一樣

數據類型

基礎類型

類型說明

Byte

8位帶符号整數

Short

16位帶符号整數

Int

32位帶符号整數

Long

64位帶符号整數

Char

16位無符号Unicode字符

String

Char類型的序列(字符串)

Float

32位單精度浮點數

Double

64位雙精度浮點數

Boolean

true或false

注意下 scala類型與Java的區别

scala中所有的類型都使用大寫字母開頭

整形使用Int而不是Integer

scala中定義變量可以不寫類型,讓scala編譯器自動推斷

運算符

類别

操作符

算術運算符

+、-、*、/

關系運算符

>、

邏輯運算符

&&、||、!

scala中沒有,++、--運算符

與Java不一樣,在scala中,可以直接使用==、!=進行比較,它們與equals方法表示一緻。而比較兩個對象的引用值,使用eq

示例

有一個字符串"abc",再創建第二個字符串,值為:在第一個字符串後拼接一個空字符串。

然後使用比較這兩個字符串是否相等、再查看它們的引用值是否相等。

參考代碼

val str1 = "abc"

val str2 = str1 + ""

str1 == str2

str1.eq(str2)

scala類型層次結構

類型

說明

Any

所有類型的父類,,它有兩個子類AnyRef與AnyVal

AnyVal

所有數值類型的父類

AnyRef

所有對象類型(引用類型)的父類

Unit

表示空,Unit是AnyVal的子類。它類似于Java中的void,但scala要比Java更加面向對象

Null

Null是AnyRef的子類,也就是說它是所有引用類型的子類。可以将null賦值給任何對象類型

Nothing

所有類型的子類 不能直接創建該類型實例,某個方法抛出異常時,返回的就是Nothing類型,因為Nothing是所有類的子類,那麼它可以賦值為任何類型

nothing

def main(args: Array[String]): Unit = {

    val c = m3(1,0)

} 

def m3(x:Int, y:Int):Int = {

    if(y == 0) throw new Exception("這是一個異常")

    x / y

}

問題

以下代碼是否有問題?

val b:Int = null

scala會解釋報錯:

Null類型并不能轉換為Int類型,說明Null類型并不是Int類型的子類

條件表達式

條件表達式就是if表達式。scala條件表達式的語法和Java一樣。

有返回值的if

參考代碼

scala> val sex = "male"

sex: String = male

scala> val result = if(sex == "male") 1 else 0

result: Int = 1

與Java不一樣的是,

在scala中,條件表達式也是有返回值的

在scala中,沒有三元表達式,可以使用if表達式替代三元表達式

塊表達式

scala中,使用{}表示一個塊表達式

和if表達式一樣,塊表達式也是有值的

值就是最後一個表達式的值

問題

請問以下代碼,變量a的值是什麼?

scala> val a = {

    | println("1 + 1")

    | 1 + 1

    | }

循環

在scala中,可以使用for和while,但一般推薦使用for表達式,因為for表達式語法更簡潔

for表達式

語法

for(i <- 表達式/數組/集合) {

    // 表達式

}

簡單循環

使用for表達式打印1-10的數字

參考代碼1

scala> val nums = 1.to(10)                                                             

nums: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for(i <- nums) println(i)    

參考代碼2

// 中綴調用法

scala> for(i <- 1 to 10) println(i)

嵌套循環

使用for表達式,打印以下字符

*****

*****

*****

參考代碼

for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}

守衛

for表達式中,可以添加if判斷語句,這個if判斷就稱之為守衛。我們可以使用守衛讓for表達式更簡潔。

語法

for(i <- 表達式/數組/集合 if 表達式) {

    // 表達式

}

示例

使用for表達式打印1-10之間能夠整除3的數字

參考代碼

// 添加守衛,打印能夠整除3的數字

for(i <- 1 to 10 if i % 3 == 0) println(i)

for推導式

在for循環體中,可以使用yield表達式構建出一個集合,我們把使用yield的for表達式稱之為推導式

示例

生成一個10、20、30...100的集合

參考代碼

// for推導式:for表達式中以yield開始,該for表達式會構建出一個集合

val v = for(i <- 1 to 10) yield i * 10

while循環

scala中while循環和Java中是一緻的

示例

打印1-10的數字

參考代碼

scala> var i = 1

i: Int = 1

scala> while(i <= 10) {

     | println(i)

     | i = i+1

     | }

break和continue

scala中,沒有break/continue關鍵字

如果一定要使用break/continue,就需要使用scala.util.control包的Break類的breable和break方法。

實現break

用法

導入Breaks包import scala.util.control.Breaks._

使用breakable将for表達式包起來

for表達式中需要退出循環的地方,添加break()方法調用

示例

使用for表達式打印1-100的數字,如果數字到達50,退出for表達式

參考代碼

// 導入scala.util.control包下的Break

import scala.util.control.Breaks._

breakable{

    for(i <- 1 to 100) {

        if(i >= 50) break()

        else println(i)

    }

}

實現continue

用法

continue的實現與break類似,但有一點不同:

實現continue是用breakable{}将for表達式的循環體包含起來

示例

打印1-100的數字,使用for表達式來遍曆,如果數字能整除10,不打印

// 導入scala.util.control包下的Break    

import scala.util.control.Breaks._

for(i <- 1 to 100 ) {

   breakable{

       if(i % 10 == 0) break()

       else println(i)

  }

相關客戶案例查看更多