1.16
函数
Scala 支持函数式编程,Spark/Flink 程序会大量使用函数。
定义
val 函数变量名 = (参数名1:参数类型1, 参数名2:参数类型2...) => 函数体
函数是一个对象
类似于方法,函数也有参数列表和返回值
函数定义不需要使用 def 定义
无需指定返回值类型
示例:定义一个计算两个整数之和的函数。
val getSum = (a:Int, b:Int) => a + b
val sum = getSum(1, 2)//3
方法和函数的区别
方法属于类或者对象,在运行时会加载到 JVM 的方法区。
可以将函数对象赋值给一个变量,在运行时会加载到 JVM 的堆中。
函数是一个对象,继承自 FunctionN,函数对象有apply、curried、toString、tupled这些方法,方法则没有。
结论:在 Scala 中,函数是对象,而方法是属于对象的,可以理解为:方法归属于函数。
可以通过在方法后加上空格和下划线将其转为函数,例如定义一个求和方法并转为函数:
def add(a:Int, b:Int):Int = a + b
val func = add _
func(1, 2)//3
案例:打印nn乘法表
通过方法:
def write(n:Int){
for(row <- 1 to n;col <- 1 to row){
print(s"${col} x ${row} = ${col * row}\t")
if(row == col) println()
}
}
通过函数:
val func = (n:Int) => {
for(row <- 1 to n;col <- 1 to row){
print(s"${col} x ${row} = ${col * row}\t")
if(row == col) println()
}
}
类和对象
类和对象
创建类和对象可以通过 class 和 new 关键字实现,用 class 创建类,用 new 创建对象。
示例:创建一个 Person 类,然后创建其对象并打印。
创建一个 Scala 项目,并创建一个 Object 类(Object 修饰的类是单例对象)。
在 object 类中添加 main 方法。
创建 Person 类,并在 main 方法中创建 Person 类的对象然后输出结果。
//实体类
class Person {
}
----------------------------------------------
//测试类
object ClassDemo {
//main方法,作为程序主入口,所有代码执行都从这里开始
def main(args: Array[String]): Unit = {
//创建 Person 对象
val person = new Person()
//打印对象
println(person)
}
}
如果类是空的,没有任何成员,可以省略{}
如果构造器参数为空,可以省略()
//简写类和对象
object ClassDemo {
class Person
def main(args: Array[String]): Unit = {
val person = new Person
println(person)
}
}
成员变量
可以使用 var/val 定义成员变量,对象通过 对象名. 的方式访问成员变量。
示例:定义一个 Person 类,包含一个姓名和年龄字段,创建一个具体对象并打印。
object ClassDemo {
class Person{
var name = ""
var age = 0
}
def main(args: Array[String]): Unit = {
val person = new Person
person.name = "sjh"
person.age = 24
print(s"姓名:${person.name},年龄:${person.age}")
}
}
使用下划线初始化成员变量
在定义 var 类型的成员变量时,可以使用 _ 初始化成员变量。
val 类型的成员变量,必须要自己手动初始化。
例如:
class Person{
var name:String = _
var age:Int = _
}
定义和访问成员方法
在 Scala 的类中,也是使用 def 定义方法。
object ClassDemo {
class Person{
var name:String = _
var age:Int = _
def printHello(msg:String): Unit = print(msg)
}
def main(args: Array[String]): Unit = {
val person = new Person
print(person.printHello("hello scala"))
}
}
访问修饰符
在 Scala 中没有 public 关键字,没有被标记为 private 和 protected 的成员都是公共的。
Scala 中的权限修饰符只有:privat、private[this]、protected、默认。
object ClassDemo {
class Person{
private var name:String = _
private var age:Int = _
//获取姓名
def getName:String = name
//设置姓名
def setName(name:String): Unit = this.name = name
//获取年龄
def getAge:Int = age
//设置年龄
def setAge(age:Int): Unit = this.age = age
}
def main(args: Array[String]): Unit = {
val person = new Person
person.setName("sjh")
person.setAge(24)
}
}