在 Scala 中函數與方法通常都表示一個意思,二者在使用上沒有實質區別,一般在開發中也是可以相互替代和轉換的。
<br>
在函數式編程中,函數是一等公民。函數可以作為參數值傳入其他函數中,函數的返回值可以是函數,函數甚至可以嵌套函數。
<br/>
如果非要區分的話,總結的區別如下:
(1)Scala 中的方法跟 Java 的類似,方法是組成類的一部分,指代類的成員;
(2)Scala 中的函數則是一個完整的對象,其實就是繼承了Trait 的類的對象,Scala中內置了了許多 Trait(Function0~Function22)分別表示不同的參數個數的函數;
(3)如果更明確劃分的話,Scala 中使用 `val` 語句定義函數,`def` 語句定義方法。(但我們習慣上將 `def` 定義稱為函數,`val`定義的為常量);
```scala
object HelloWorld {
def main(args: Array[String]): Unit = {
// 定義方法
def m1(x: Int, y: Int): Int = x * y
def m2(): Unit = println("無參方法")
println(m1(100, 200)) // 20000
m2() // 無參方法
m2 // 無參時可以省略 ()
// 定義函數
val m3 = (x: Int, y: Int) => { x * y }
val m4 = () => println("無參函數")
println(m3(100, 200)) // 20000
m4() // 無參方法
// m4 即使函數無參,調用時也不能省略 (),否則什么都不做,也不報錯
}
}
```
通過反編譯,看到的Java代碼如下:
```java
...
// m3是一個Function2對象
Function2 m3 = new AbstractFunction2.mcIII.sp() { public static final long serialVersionUID = 0L;
...
};
// m4 是一個Function0對象
Function0 m4 = new HelloWorld..anonfun.2();
...
}
// m1和m2是一個方法
private final int m1$1(int x, int y)
{
return x * y; }
private final void m2$1() { Predef..MODULE$.println("無參方法"); }
}
```
- Scala是什么?
- Scala特性
- 開發環境搭建
- 環境搭建
- windows下的環境搭建
- IntelliJ IDEA環境搭建
- Scala關鍵字
- Hello, World
- 數據類型
- 數據類型
- 數據類型層次結構
- 字面量
- Null類型
- Nothing類型
- Unit類型
- 變量與常量
- type定義類型別名
- 字符串插值器
- 條件控制
- 循環控制
- 數組
- 元組
- 集合
- 集合分類
- List常用操作
- Set常用操作
- Map常用操作
- 函數
- 函數聲明與調用
- 函數與方法的區別
- 函數注意事項
- 匿名函數
- 可變參數
- 高階函數
- 中置表達式
- 函數嵌套
- 函數科里化
- 隱式參數
- 隱式函數
- 閉包
- 類和對象
- Java與Scala的比較
- 有關類與對象概念
- 類
- 類的定義和調用
- 類的繼承
- 抽象類
- 單例對象
- 伴生對象和伴生類
- 特質
- 定義特質
- 混入特質
- 抽象類與特質的選擇
- 自身類型
- 依賴注入
- this別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型