变量语法格式
val / var 变量名:变量类型 = 初始值
val 定义的是不可重新赋值的变量,也就是自定义常量
var定义的是可重新赋值的变量
** 可以使用更简洁的方式定义变量 **
var name = "tom"
scaka可以自动根据变量的值自动推断出变量的类型,这样写的代码更简洁
var str = s"${name}is a boy !"
var str = """
三引号这里放大量文本
"""
惰性赋值
当有一些变量保存的数据较大时,而这些数据又不需要马上加载到JVM内存中。我们就可以使用惰性赋值来提高效率
语法格式:
lazy val / var 变量名 = 表达式
Scala数据类型
基本数据类型和java一样,所有数据类型首字母大写
Scala中数据类型层次机构
for循环
守卫:
for表达式中可以添加if判断就称之为守卫。我们可以使用守卫让for表达式更加简洁。
语法:
for(i <- 表达式/数组/集合 if 表达式){
// 逻辑代码
}
示例:
for(i <- 1 to 10 if i %3 == 0) println(i)
for推导式:
scala中的for也是有返回值的,在for循环体中,可以使用yield表达式构建出一个集合,我们把使用yield的for表达式称之为推导式
示例:
生成一个 10、20、30、… 100的集合
参考代码:
val v = for(i <- 1 to 10) yield i*10
println(v)
方法
def 方法名(参数名:参数类型,参数名:参数类型):[return type] = {
// 方法主体
}
参数列表的参数类型不能省略
返回值类型可以省略,由scala编译器自动推断
返回值可以不写return,默认就是{}块表达式的值
注意:递归方法必须写返回值
方法参数
scala中发方法参数,使用比较灵活。它支持以下几种类型的参数:
- 默认参数(定义参数的时候给定参数的默认值)
- 带名参数 (在调用方法时,可以指定参数的名称来进行调用)
- 变长参数 (如果方法的参数是不固定的,可以将该方法的参数定义为变成参数)
def 方法名(参数名:类型*):返回值类型 = { }
方法调用方式
在scala中,有以下几种方法调用方式:
- 后缀调用法
- 中缀调用法
- 花括号调用法
- 无括号调用法
在编写spark,flink程序时,会经常使用这些方法调用方式
后缀调用法:
这种方式和java没有区别,非常简单
对象名.方法名(参数)
Math.abs(-1)
中缀调用法
语法:对象名 方法名 参数
例: 1 to 10
例: Math abs -1
扩展知识:
在scala中,操作符即方法
如: 1 + 1
上式中的 “+” 就是一个方法
花括号调用法:
例: Math.abs { -1 }
例: Math.abs {
println("打印绝对值了")
-1
}
注意:方法只有一个参数的时候,才能使用花括号调用法
无括号调用法:
如果没有参数,可以省略方法名后面的括号
// 定义无参数方法
def sayHello() = println("Hello, Scala")
// 调用
sayHello()
sayHello
注意:
在scala中如果方法的返回值类型是Unit类型(也就是没有返回值),这样的方法称之为过程(procedure)
过程的等号(=)可以省略不写,例如:
def sayHello() = print(“Hello”)
改为:
def sayHello() { print(“hello”) } // 这个花括号不能省略
惰性方法
当记录方法返回值的变量被声明为lazy时,方法的执行将被推迟,直到我们首次使用该值时,方法才会执行,像这样的方法就叫:惰性方法
注意:
- java中并没有提供原生态的“惰性”技术,但是可以通过特定的代码结构实现,这种结构被称之为:懒加载(也叫延迟加载)
2.lazy不能修饰var类型的变量
使用场景:
- 打开数据库
- 提升默写特定模块的启动时间
- 确保对象中的某些字段能优先初始化
函数
scala中是支持函数式编程的,将来编写Spark/Flink程序将会大量用到函数
定义函数
val 函数变量名 = (参数名:参数类型, 参数名:参数类型...) => 函数体
var total = (a:Int, b:Int) => {a + b}
println(total(1,2))
注意:
- 在scala中,函数是一个对象(变量)
- 类似于方法,函数也有参数列表和返回值
- 函数定义不需要使用def定义
- 无需指定返回值类型
方法和函数的区别
在java中,方法和函数之间没有任何区别,只是叫法不同,但是在scala中函数和方法就有区别了,具体如下:
- 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
- 可以将函数对象赋值给一个变量,在运行时,它是加载JVM的堆内存中
- 函数是一个对象,继承自FunctionN, 函数对象有apply, curried, toString, tupled这些方法。方法则没有
结论:在scala中,函数式对象,而方法时属于对象的,所有可以理解为:方法归属于函数
方法转换为函数:
有时候需要将方法转换为函数,例如:作为变量传递,就需要将方法转换为函数
格式:
var 变量名 = 方法名 _ // 格式为:方法名 + 空格 + 下划线