scala中“=>”的4種使用場景


一直以來都對scala中“=>”的使用比較迷茫,也不知道他表示什么意思。今天就它的使用場景列舉如下,希望可以共同探討。

  1. 表示函數的返回類型(Function Type)

     scala> def double(x: Int): Int = x*2
     double: (x: Int)Int
     //定義一個函數變量:	
     scala> var x : (Int) => Int = double
     x: Int => Int = <function1>
     //調用
     scala> x(2)
     res1: Int = 4
    

函數double的類型就是 (x: Int) => Int 或者 Int => Int。左邊是參數類型,右邊是方法返回值類型。
備注: 當函數只有一個參數的時候,函數類型里面括起來函數參數的括號是可以省略的。

  1. 匿名函數

     //通過匿名函數定義一個函數變量xx
     scala> var xx = (x: Int) => x + 1
     xx: Int => Int = <function1>
     //給一個高階函數,傳遞一個函數:
     scala> val newList = List(1,2,3).map { (x: Int) => x * 2 }
     newList: List[Int] = List(2, 4, 6)
    

匿名函數定義, 左邊是參數 右邊是函數實現體 (x: Int)=>{}

  1. case語句

    scala> val x = 10; val y = 20
    x: Int = 10
    y: Int = 20
    
    scala> val max = x > y match {
      case true => x
      case false => y
    }
    max: Int = 20
    

在模式匹配 match 和 try-catch 都用 “=>” 表示輸出的結果或返回的值

  1. By-Name Parameters(傳名參數),傳名參數在函數調用前表達式不會被求值,而是會被包裹成一個匿名函數作為函數參數傳遞下去,例如參數類型為無參函數的參數就是傳名參數。

     scala> def doubles(x: => Int) = {
         println("Now doubling " + x)
         x*2   
     }
     doubles: (x: => Int)Int
     //調用函數
     scala> doubles(3)
     Now doubling 3
     res2: Int = 6
    
     scala> def f(x: Int): Int = {
       println(s"Calling f($x)")
       x
     }
     f: (x: Int)Int
     //調用函數
     scala> doubles(f(3))
     Calling f(3)
     Now doubling 3
     Calling f(3)
     res9: Int = 6
    

對於函數doubles而言,它的參數x就是by-name的。如果調用doubles的時候,直接給個普通的值或者非函數變量。那么doubles的執行結果就跟普通的函數沒有區別。但是當把一個返回值為Int類型的函數,例如f(2),傳遞給doubles的時候。那么f(2)會被先計算出返回值2,返回值2傳入doubles參與運算。運算完成以后,f(2)會被doubles在執行以后,再調用一遍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM