6夜焦、scala基礎(chǔ)語法-函數(shù)式編程

1搏予、面向?qū)ο缶幊毯秃瘮?shù)式編程

對比

2点把、函數(shù)定義格式

def 函數(shù)名 ([參數(shù)名: 參數(shù)類型], ...)[[: 返回值類型] =] {
語句... //完成某個功能
return 返回值
}

def test(s:String) : String ={
      return "abc"
    }

3借宵、函數(shù)的各種簡化和變形

1) 省略return (方法體內(nèi)最后一行為返回的值)

  def test1(s:String) : String ={
      "abc"
    }
    println(test1("a")) // abc

2) 省略返回值類型(scala會自動判斷最后一行值的類型)

  def test2(s:String)  ={
      "abc"
    }
  println(test2("a")) // abc

3) 省略入?yún)?/strong>

  def test3()  ={
      "abc"
    }
  println(test3()) // abc

4)省略大括號()當方法體內(nèi)只有一行代碼時幌衣,可以省略{ }

    def test4()  ="abc"
    println(test4()) // abc  

5)省略小括號 當方法沒有入?yún)r,可以省略()

    def test5  = "abc"
    println(test5) // abc  若方法省了小括號壤玫,在調(diào)用時也可以省略小括號

def test5 = "abc"
val ssss = "abc"
方法和變量只有關(guān)鍵字不一樣

6)補充

  • 方法省略等號豁护,返回值為Unit
    def test6(){
      "abc"
    }
    println(test6()) // ()
  • 方法體沒有返回值是Unit,
    只要定義的返回值時Unit,不管方法體最后一行是什么都會返回Unit
//方法體沒有返回值是Unit,
    // 要定義的返回值時Unit,不管方法體最后一行是什么都會返回Unit類型
    def test1(s:String) : Unit ={

    }
    def test2(s:String) : Unit ={
      "abc"
    }
    println(test1("a")) // ()
    println(test2("a")) // ()
  • 7)可變參
  def test7(s:String*)={ 
     for(i<- s){
        println(i)
      }
    }

    test7("張三","里斯") //張三
                        //里斯

4哼凯、Scala是完全面向函數(shù)的語言

注意:

函數(shù)的類型:() => Int、Int => Int 楚里、(Int) = >Int等

1)函數(shù)可以賦值給變量
2)函數(shù)可以作為函數(shù)的參數(shù)
   def f5(f6 : () => Int): Int ={
      f6()+10
    }

    def f(): Int ={
      5
    }

    println(f5(f)) //15

簡化(匿名函數(shù))

    def f5(f6 : () => Int): Int ={
      f6()+10
    }

    println(f5(()=>{5})) //15
    val a = ()=>{"a"}
    println(a) // <function0>
    println(a()) // a

匿名函數(shù)加強(匿名函數(shù)傳遞的是一段邏輯)

    def f7(f : (Int) => Unit) : Unit = {
      f(10)
    }

    f7((i) => {println(i)}) //10
    f7((i) => println(i)) //10
    f7(i => println(i)) //10
    f7(println(_)) //10
   def f8(f:(Int,Int) => Int): Int = {
      f(10,10)
    }

    println(f8((x:Int,y:Int) => {x+y})) // 20
    println(f8((x,y) => { x+y })) // 20
    println(f8((x,y) => x+y)) // 20
    println(f8(_+_)) // 20
3)函數(shù)可以作為函數(shù)的返回值
  def f()={
      "scala"
    }

    def f1() ={
      f  //當方法沒有入?yún)r挡逼,調(diào)用時可以省略小括號
    }

    println(f1()) // scala
    println(f1()()) // 直接提示錯誤
    def f()={
      "scala"
    }

    def f1() ={
      f _  // 有 _ 返回才是函數(shù),而不是值
    }

    println(f1()) // <function0>
    println(f1()()) // scala

解釋:一般情況下腻豌,f標識傳遞引用家坎,f()表示實際調(diào)用

f _ :中的 _ 如果不寫返回值并不是一個函數(shù),而是f函數(shù)的返回值吝梅。在函數(shù)f1中虱疏,函數(shù)f也會執(zhí)行(因為無參函數(shù)調(diào)用,可以省略小括號)苏携。

簡化

    def f1():() => String ={
      def f() : String ={
        "scala"
      }
      f _  //scala中函數(shù)哪里都寫可以做瞪,這種只是相當于把f函數(shù)寫道f1里面
    }

    print(f1()())

解釋:

()=>String 代表返回的是一個函數(shù),沒有入?yún)⒂叶常祷刂凳荢tring的函數(shù)

再變型

   def f2(i :Int) : Int => Int ={
      def f3(j:Int): Int ={
        i*j
      }
      f3 _
    }

    println(f2(3)(4)) //12

注意:正常再觸發(fā)f3函數(shù)時装蓬,f2已經(jīng)彈棧,入?yún)不能再f3中拿到運用纱扭,這里有個閉包的概念牍帚。把i 的生命周期改變,就像再把i和j打成一個包乳蛾,放到f3里面

關(guān)于閉包的類比:
類似java堆棧暗赶,通常認知,方法進棧肃叶,對象進堆
1蹂随、棧上分配
public void test(){
User user = new User
//如果創(chuàng)建千萬對象,彈棧后因惭,方法之外的地方也沒有用到這些對象岳锁,則這些對象隨著方法彈棧,不進入堆中
}
2蹦魔、逃逸分析
public User test(){
User user = new User
return user
// 方法返回了對象激率,這時不在隨方法彈棧,逃逸進入堆中
}

柯里化(上面的簡化)

  def f2(i:Int)(j:Int) : Int = {
      i*j
    }

    println(f2(3)(4))

5版姑、其他知識點

  • 惰性函數(shù)
    def sum(i:Int,j:Int): Int ={
      println("sum函數(shù)執(zhí)行了")
      i+j
    }

    val res = sum(10,20)
    println("----------x----------")
    println("----------x----------")
    println("----------x----------")
    println(res)

結(jié)果:sum函數(shù)執(zhí)行了
----------x----------
----------x----------
----------x----------
30

    lazy val res = sum(10,20)
    println("*******x********")
    println("*******x********")
    println("*******x********")
    println(res)

結(jié)果:
*******x********
*******x********
*******x********
sum函數(shù)執(zhí)行了
30

  • 惰性函數(shù)加載時才執(zhí)行
  • lazy不能修飾var變量
  • lazy修飾函數(shù)和變量柱搜,都會導致延遲加載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剥险,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宪肖,老刑警劉巖表制,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件健爬,死亡現(xiàn)場離奇詭異,居然都是意外死亡么介,警方通過查閱死者的電腦和手機娜遵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壤短,“玉大人设拟,你說我怎么就攤上這事【酶” “怎么了纳胧?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帘撰。 經(jīng)常有香客問我跑慕,道長,這世上最難降的妖魔是什么摧找? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任核行,我火速辦了婚禮蹬耘,結(jié)果婚禮上综苔,老公的妹妹穿的比我還像新娘。我一直安慰自己蛆挫,他們只是感情好妙黍,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布拭嫁。 她就那樣靜靜地躺著做粤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妇垢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音涨薪,去河邊找鬼。 笑死献丑,一個胖子當著我的面吹牛侠姑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播结借,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咖熟!你這毒婦竟也來了柳畔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤确沸,失蹤者是張志新(化名)和其女友劉穎罗捎,沒想到半個月后拉盾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捉偏,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡夭禽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年讹躯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剩彬。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡矿卑,死狀恐怖沃饶,靈堂內(nèi)的尸體忽然破棺而出母廷,到底是詐尸還是另有隱情,我是刑警寧澤糊肤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站馆揉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏升酣。R本人自食惡果不足惜舷暮,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一噩茄、第九天 我趴在偏房一處隱蔽的房頂上張望下面。 院中可真熱鬧,春花似錦绩聘、人聲如沸沥割。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椒拗。三九已至,卻和暖如春陡叠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背预茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工侦厚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刨沦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓膘怕,卻偏偏與公主長得像想诅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岛心,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容