scala == java++
面向对象 函数式语言
也是基于JVM的
对比java中的
aa.java-(javac)->aa.class编译过程
scala如下:
aa.scala -(scalac)-> aa.class 编译过程
1.1 变量和数据类型
var变量
val常量 : 在程序执行的过程中,其值不会被改变的变量
var i:Int = 10
val j:Int = 20 value
# 能用常量的地方不用变量
# 变量类型确定后不能修改 说明scala是强数据类型语言
# 变量声明时,必须有初始值
用反引号 `` 可以包含任意字符串,哪怕是scala关键字也可以
val con_user = all_user.select("imei1").dropDuplicates().filter($"hashId" >= 0 && $"hashId" <= 59)
# 字符串通过+进行拼接
# printf 中字符串可以通过%进行传值
# 插值字符串:字符串模板可以通过$获取变量值
object Test03_String {
def main(args: Array[String]): Unit = {
val name:String = "alice"
val age:Int = 19
println(age + "岁的" + name)
printf("%d岁的%s",age,name)
println(s"${age}岁的${name}")
}
}
Scala中一切数据都是对象,都是Any的子类
scala中数据类型分为两大类:数值类型AnyVal 引用类型AnyRef 它俩都是对象
scala仍然遵守隐式转换
Unit Null 和Nothing类型
Unit表示无值 和其他语言中void等同 方法不返回任何内容是使用
Null 类型只有一个实例值null
Nothing 在scala中类层级最低端,是任何类型的子类型。如果一个函数没有正常的返回值,可以使用Nothing
强制类型转换
java: int num = (int)2.5
scala: var num : Int = 2.7.toInt
val n1 :Int = 1.1.toInt
强转的符号只针对最近的,可以通过()进行综合转换
val f2 :Int = "12.3".toFloat.toInt
val result:String ={
val a = "测试"
print(a)
a
}
1.2 运算符
1.3 流程控制
1.4 函数式编程
1.4.1 函数基础
函数的基本语法:
def sum(x:Int,y:Int):Int={ # 注意格式
x+y
}
函数和方法:
函数:为完成某一功能的程序语句的集合,称为函数
方法:类中的函数称为方法
可变参数:可变参数一般放在最后 参数默认值,一般将其放在后边
scala中:
return可以省略,scala会使用函数体的最后一行作为返回值
返回值类型如果可以推断出来,则可以省略返回值类型 def f3(name:String){ ... }
如果函数声明了Unit,那么即使函数体中使用return关键字也不起作用
如果有return,则不能省略返回值类型
scala如果期望是无返回值类型,则可以省略等号
如果函数无参,但是声明了参数列表,那么调用时,小括号可以不加
def f7():Unit={
println("test")
}
# 进行函数调用
f7()
# 或者
f7
函数声明时,如果没有参数列表,那么小括号可以省略
def f8:Unit={
println("function f8")
}
匿名函数/Scala中lambda表达式
(name:String)=>{println(name)}
1.4.2 函数高阶
1.4.2.1 高阶函数
在scala中,函数是一等公民。可以调用、定义函数。
高阶用法:
- 函数可以作为值传递
- 函数可以作为参数进行传递
- 函数可以作为函数返回值返回
object Test_fun_CollectionFun {
def main(args: Array[String]): Unit = {
// 对数组进行处理,处理结果返回一个新数组
val arr:Array[Int] = Array(12,1,45,75)
def arrayOperation(array:Array[Int],op:Int=>Int):Array[Int]={
for (elem<-array) yield op(elem)
}
def addOne(elem:Int):Int={
elem+1
}
// 调用函数测试
val newArray:Array[Int] = arrayOperation(arr,addOne)
println(newArray.mkString(","))
}
}
1.4.2.2 匿名函数
匿名函数:没有名字的函数就是匿名函数。
(x: Int) => {函数体} # 其中x代表输入参数,Int代表输入参数类型,函数体为具体代码逻辑
* 匿名函数的至简原则
* 1.参数的类型可以省略,会根据形参进行自动的推导
* 2.类型省略之后,发现只有一个参数,则圆括号可以省略。其他情况:没有参数或者参数超过1 的永远不能省略圆括号
* 3.匿名函数如果只有一行,则大括号也可以省略
* 4.如果参数只出现一次,则参数省略且后面参数可以用_代替
object Test_fun_niming_02 {
def main(args: Array[String]): Unit = {
def dualFunctionOneAndTwo(fun:(Int,Int)=>Int):Int = {
fun(1,2)
}
val add = (a:Int,b:Int) => a+b
val minus = (a:Int,b:Int) => a-b
// 匿名函数至简原则
println(dualFunctionOneAndTwo(add))
println(dualFunctionOneAndTwo((a,b)=> a+b))
println(dualFunctionOneAndTwo( _ + _ ))
}
}
1.4.2.3 函数柯里化&闭包
闭包:函数式编程的标配
闭包:如果一个函数,访问到了它的外部变量的值,那么这个函数和他所处的环境,称为闭包。
函数柯里化:把一个参数列表的多个参数,变成多个参数列表。
def addCurrying(a:Int)(b:Int):Int={
a+b
}