Scala

Scala-函数初步
- Scala
-
-
- [1. 函数基本语法](#1. 函数基本语法)
- [2. 函数和方法的区别](#2. 函数和方法的区别)
- [3. 函数定义](#3. 函数定义)
- [4. 函数参数](#4. 函数参数)
- [5. Scala函数至简原则](#5. Scala函数至简原则)
- [整理不易 列位 三连支持一下哈~🤣🤣🤣](#整理不易 列位 三连支持一下哈~🤣🤣🤣)
-

1. 函数基本语法

Scala 中的函数是一种独立的代码块------接受一些输入(称为参数),并返回一个输出。
scala
def 函数名(参数列表): 返回类型 = {
// 函数体
// 返回值
}
def
:用来定义函数。函数名
:函数的名称。参数列表
:函数接收的输入参数,可以有多个,用逗号分隔。返回类型
:函数的返回值类型,必须显式声明。函数体
:包含函数执行的代码逻辑。

Demo🤣🤣🤣:
定义 add
函数,接受两个整数参数 a
和 b
,返回它们的和,返回类型是 Int
。

2. 函数和方法的区别
- 函数 :函数通常是指一段独立的代码,接受输入并返回输出。Scala 中的函数在定义时是独立的代码块。
- 函数是独立的,可以作为值传递。
- 函数是纯的,没有副作用。
- 函数可以嵌套定义。

- 方法 :方法是附属于对象或类的函数 。它通常是某个类的成员 ,并且可以访问类的字段和其他成员。Scala 中的所有方法都是函数,但并非所有函数都是方法。
- 方法是类的一部分,定义在类或对象中。
- 方法可以访问类的状态,可以有副作用。
- 方法可以进行重载和重写。
Demo🤣🤣🤣:

Tips:
(1)Scala语言可以在任何的语法结构中声明任何的语法
Demo🤣🤣🤣:
在对象中定义函数:
scala
// 在对象中定义函数
object MyFunctions {
def add(a: Int, b: Int): Int = {
a + b
}
}
val result = MyFunctions.add(3, 4) // 结果是 7
在类中定义方法:
scala
// 在类中定义方法
class Calculator {
def add(a: Int, b: Int): Int = {
a + b
}
}
val calc = new Calculator
val result = calc.add(3, 4) // 结果是 7
(2)函数没有重载和重写的概念;方法可以进行重载和重写
- 重载(Overloading) 是指方法名相同,但参数不同的方法。Scala 支持方法的重载。
- 重写(Overriding) 是指在子类中重新定义父类的方法,覆盖父类的方法。Scala 也支持方法的重写,但需要使用
override
关键字。
Demo🤣🤣🤣:
方法重载:
scala
class MathOperations {
def add(a: Int, b: Int): Int = a + b
def add(a: Double, b: Double): Double = a + b
}
val mathOps = new MathOperations
val intResult = mathOps.add(3, 4) // 结果是 7
val doubleResult = mathOps.add(3.5, 4.5) // 结果是 8.0
方法重写:
scala
class Animal {
def speak: String = "Animal speaks"
}
class Dog extends Animal {
override def speak: String = "Dog barks"
}
val dog = new Dog
val result = dog.speak // 结果是 "Dog barks"
函数没有重载和重写的概念:
scala
// 定义一个函数
val add: (Int, Int) => Int = (a, b) => a + b
// 不能重载函数
// val add: (Double, Double) => Double = (a, b) => a + b // 这将导致编译错误
(3)Scala中函数可以嵌套定义
在 Scala 中,函数可以嵌套定义,即在一个函数内部定义另一个函数。
Demo🤣🤣🤣:

特性 | 函数 | 方法 |
---|---|---|
定义位置 | 可以在类或对象外部定义 | 定义在类或对象内部 |
是否与类实例相关联 | 不依赖于类实例(可以独立存在) | 依赖于类的实例,必须通过实例调用(除非是静态方法) |
是否可以重载 | 不支持重载 | 支持重载(可以定义多个相同名称、不同参数的方法) |
是否可以重写 | 不支持重写 | 支持重写(子类可以覆盖父类方法) |
嵌套定义 | 可以嵌套函数 | 不支持直接嵌套方法(方法通常依赖于类的结构) |
用途 | 更适合用于函数式编程或与类无关的逻辑操作 | 更适合在面向对象编程中进行状态管理和类行为定义 |
3. 函数定义
(1)无参,无返回值:

(2)无参,有返回值:

(3)有参,无返回值:

(4)函数4:有参,有返回值:

(5) 函数5:多参,无返回值:

(6)函数6:多参,有返回值:

4. 函数参数
(1)默认参数
如果参数有默认值,可以在函数定义时指定默认值,在调用函数时可以省略这个参数:

(2)命名参数
在调用函数时,通过命名参数来明确指定某个参数的值,顺序可以不一致:

(3) 可变参数
在定义函数时,使用 * 来表示可变参数。可变参数------允许传递任意数量的参数。
以 *
符号表示,函数体内可以将其视为一个数组:

- 可变参数必须是函数参数列表中的最后一个参数。

- 可变参数可以接收零个或多个参数。

5. Scala函数至简原则
Scala 提倡函数至简原则(Function Simplicity Principle),即在函数设计上保持简洁和直观。
- (1)return 可以省略,Scala 会使用函数体的最后一行代码作为返回值
在 Scala 中,函数体的最后一行代码会被隐式地作为返回值,通常不需要显式使用 return
关键字。

- (2)如果函数体只有一行代码,可以省略花括号
如果函数体只有一行代码,可以省略花括号,代码更加简洁。

- (3)返回值类型如果能够推断出来,可以省略(:和返回值类型一起省略)
Scala 具有类型推断能力,如果编译器能够推断出返回值类型,可以省略返回值类型。

- (4)如果有 return,则不能省略返回值类型,必须指定
如果函数体中使用了 return
关键字,必须显式指定返回值类型。
- (5)如果函数明确声明 unit,那么即使函数体中使用 return 关键字也不起作用
如果函数的返回类型声明为 Unit
,即使使用 return
关键字,也不会影响函数的行为。

- (6)Scala 如果期望是无返回值类型,可以省略等号
如果函数的返回类型是 Unit
,可以省略等号 =
。

- (7)如果函数无参,但是声明了参数列表,那么调用时,小括号可加可不加
如果函数没有参数,但在定义时声明了空的参数列表,调用时可以省略或保留小括号。

- (8)如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
如果函数没有参数列表,定义时可以省略小括号,调用时也必须省略小括号。

- (9)如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略
如果只关心逻辑处理而不关心函数名称,可以使用匿名函数(Lambda 表达式)。
