溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala-04For與Function進階實戰(zhàn)、Lazy的使用

發(fā)布時間:2020-09-02 16:25:23 來源:網(wǎng)絡 閱讀:171 作者:kxr_123 欄目:開發(fā)技術

ForFunction進階實戰(zhàn)、Lazy的使用

一、for循環(huán)的進階實戰(zhàn)

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

For(i<- 1 to 3;j<- 3 to 8)

Println((100*i+j)+?。?span >)

也可在for循環(huán)中加入條件表達式:

For(i<- 1 to 3;j<- 3 to 8  if i!=j)

Println((100*i+j)+” ")

}

定義函數(shù)的時候一般函數(shù)都有值,函數(shù)可以作為函數(shù)的參數(shù)去賦值

def  Adsds(x: int) =x+100

val add=(x: int) => x+200

二、Function的進階實戰(zhàn)

三、Lazy延遲加載和延遲執(zhí)行

 

1For&Function進階

1For 使用

def main(args: Array[String]): Unit = {    for (i <- 1 to 2; j <- 1 to 2 if i != j)  //12的集合每次循環(huán)賦值給i,12的集合每次循環(huán)賦值給j,如果i!=j,就輸出當i=1,j=2結果為102,當i=2j=1結果是201      println((100 * i + j) + " ")}

運行代碼得到如下結果:102  201

我們看到與Java不同的是,代碼i,j都沒有進行申明類型,它可以根據(jù)右側類型元素自動進行類型推導。類型推導是Scala中非常強大的一個內容。

2Function函數(shù)使用

函數(shù)有值是scala中的非常重要的特點,因為函數(shù)有值,函數(shù)執(zhí)行必然有結果,所以函數(shù)可以作為函數(shù)的參數(shù)去傳遞,這是一個非常重要的結論,這個結論導致了函數(shù)式編程很多重要的技巧。

def addA(x: Int) = x + 100            

//定義函數(shù)addA,它的參數(shù)類型是整數(shù),因為函數(shù)有值,所以一般有=號,=號右側是函數(shù)計算過程println("The result from a function is :" + addA(2)) 

匿名函數(shù)-是函數(shù)最常見的一種形態(tài),因為Scala里只關注函數(shù)怎么做,不關注它的名字

def main(args: Array[String]): Unit = {    val add = (x: Int) => x + 200          //將匿名函數(shù)的值賦值給常量add,=>是將接收的整數(shù)類型去加200    println("The result from a val is " +  add(2)) }

函數(shù)返回值一般不指定,Scala會自動推導,但遞歸函數(shù)除外,因為遞歸函數(shù)并不知道上一次計算返回的什么樣的結果

//這里是求斐波那序列的值def main(args: Array[String]): Unit = {    def fac(n:Int): Int = if (n <= 0) 1 else n * fac(n - 1) //這里可以看到返回類型是int,如果不指定會報錯     println("The result from  a fac is : " + fac(10) )}

有默認參數(shù)的函數(shù)

//content參數(shù)被默認為I love Sparkdef main(args: Array[String]): Unit = {    def combine(content: String, left: String = "[", right: String = "]") = left + content + right    println("The result from a combine is : " + combine("I love Spark", "@", "@"))}

參數(shù)可變的函數(shù)

//通過*表示可以輸入多個參數(shù),即參數(shù)可變.這里將傳入的參數(shù)累加,賦值給resultdef main(args: Array[String]): Unit = {      def connected(args: Int*) = {          var result = 0          for(arg <- args) result += arg          result      }     println("The result from a connected is : " + connected(1,2,3,4,5) )     println("The result from a connected is : " + connected(1,2,3,4,5,6) )}

2、lazy懶加載

如果在E盤下不存在test.txt, 使用 Source.fromFile()函數(shù)讀取文件,就會報錯拋出異常, 但是如果引用的變量或常量前加上 lazy,它只有在第一次被使用時,才被實例化,lazy會延遲執(zhí)行。當發(fā)生錯誤,但沒有立即被使用,程序還是OK,只有在被使用才會報錯,懶加載的意義在于延遲執(zhí)行,可以看到一個計算的更多步驟,優(yōu)化的范圍更大,優(yōu)化的力度也更大。

例如我們在java中,一個錯誤就可能讓我們的后邊的工作無法進行,而延遲執(zhí)行,可以放任這個錯誤,繼續(xù)后邊的工作,再從整體的邏輯里再去優(yōu)化解決這個錯誤,會更好。

import scala.io.Sourceobject Test {  def main(args: Array[String]): Unit = {    lazy val file = Source.fromFile("e:\\test.txt")    println("Scala");//    for (line <- file.getLines()) {//      println(line);//    }  }}

 

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI