@R星校长
1) 与java无缝整合
2) 类型自动推断
3) 并发和分布式
4) Trait特质特性
5) Match模式匹配
6) 高阶函数
1) 类型定义声明不同,Scala :val/var Java强类型定义。
2) Scala中有类和对象,Java中有类。
3) Scala、java都是是基于Jvm,scala面向对象+面向函数编程,java面向对象编程。
4) Scala语言对于java语言简化。
5) 语法使用不同:例如for,没有break,java中有swith,Scala中有match。
1) val定义常量,var定义变量,常量不可变,变量可变。
2) Scala中自动推断类型,类型可以省略,每行后面都有分号,分号自动推断,分号可以省略。
3) Scala类可以传参,类有了参数就有了默认的构造。object不能传参。class重写构造,this中的第一行需要先调用默认的构造。
4) Scala类中的属性有getter setter方法。
5) 当new一个类时,类中除了方法不执行,其他都执行。
6) 一个scala文件中不能有重名的类和对象。
7) 如果一个scala文件中类和对象的名称相同,这个类叫做这个对象的伴生类,这个对象叫做这个类的伴生对象,可以访问私有变量。
8) Scala object对象相当于java中的单例,object中定义的都是静态的。
9) 可以在object中使用applay方法实现类似object传参功能。
10) 流程控制if…else…与java if… else…一样。
11) 流程控制 for :
1 to 10 //1 到10 包含10
1 until (10,3)//1 到10,步长为3,不包含10
for(i <- 1 to 10){
...}
for(i <- 1 to 10 ;j <- 1 to 20){
...}
for(i <- 1 to 100 ;if (i%10==0))
val vector = for(i <- 1 to 100 if(i%20 ==0)) yield i
12) 流程控制 while… do…while…
i += 1
i = i+1
1) 使用def定义方法。
2) 方法参数必须指定类型。方法体的返回值类型可以省略。
3) 默认方法将方法体中最后一行的计算结果当做返回值返回。
4) 可以使用return返回值,但是一定要指定方法体的返回值类型。建议不需要写return。
5) 如果方法名和方法体之间的“=”省略,无论方法最后一行返回值是什么,都会返回unit。对应的返回值会被丢弃。
6) 如果方法体中的逻辑可以一行搞定,可以直接去掉方法的“{… …}”
1) 必须显式的指定方法的返回值类型。
1) 参数类型后面跟上默认的值。
def fun(a:Int = 100,b:Int = 10) = {
.. ...}
2) 如何使用方法,传参时直接指定对应的变量值,例如:fun(a = 200,b=20)
1) 参数可变长方法定义:
def fun(s:String*) = {
... ...}
1) 匿名函数定义:() => {},(a:Int,b:Int)={a+b}
2) => :匿名函数
3) 可以将匿名函数赋值给一个变量,下次直接调用这个变量传参后就是使用匿名函数。
1) 嵌套方法是方法中有方法。
//偏应用表达式可以使用在频繁调用一个方法,每次调用方法中大部分参数不变,少量参数改变的场景:
def showLog(date:Date,log:String) = {
....}
val date = new Date()
val fun = showLog(date,_:String)
fun(“a”)
fun(“b”)
1) 【重点】方法的参数是函数。
2) 【重点】方法的返回是函数。
3) 方法的参数和返回都是函数。就是前两个的合并。
1) 高阶函数的简化版
def fun(a:Int,b:Int)(c:Int,d:Int)={
a+b+c+d}
fun(1,2)(3,4)
1) Scala中的String就是java中的String
1) 定义:
val array = new Array[String](长度)
val array = Array[Int](......)
2) 遍历:for,foreach
3) 方法:Array.concat(array*),map,flatMap,filter…
4) 可变长:
val array = new ArrayBuffer[String]()
array.append(... ...)
1) 定义:val list = ListString,有序不去重
2) 遍历:for,foreach
3) 方法:map[一对一],flatMap[一对多]
4) 可变长:
val list = ListBuffer[String](...)
list.append(... ...)
1) 定义:val set = SetString,无序,去重。
2) 遍历:for,foreach
3) 方法:flatMap,map,fitler…
4) 可变长:
val set = scala.collections.mutable.Set[String]()
set.add(... ...)
1) 定义:两种初始化值方式。
val map = Map[(String,Int)]("xx"->10,("xs",200))
2) 遍历:
for,foreach,map.keys,map.values
3) 方法:
val option:Option[Int] = map.get(key)
val value = option.getOrEles(xxx)
faltMap,map,filter,
4) 可变长:
val map = scala.collections.mutable.Map[(String,Int)]()
map.put(k,v)
1) tuple与集合一样,但是tuple中每个元素都有一种类型。
2) tuple最多支持22位。最常用的是tuple2,二元组。
3) tuple遍历:tuple.productIterator。
4) 每个tuple都有toString方法,tuple2有swap方法。
5) tuple取值:tuple._1/tuple._2/tuple._x
6) tuple定义可以new,可以不new 还可以直接(xx),tuple中的每个位置都是一种类型。
1) Trait相当于Java中的抽象类和接口整合。
2) Trait 中可以定义常量变量,方法的实现和方法的不实现。
3) Trait 继承多个类时,第一个关键字使用extends,之后使用with。
4) 一个类如果继承多个Trait,Trait中有相同的方法名和变量名,需要在类中重新定义覆盖。
1) 模式匹配格式
xx match {
case i:Int =>{
... }
case “hello” =>{
... ..}
case _ =>{
.... ...}
}
2) Match不仅可以匹配值还可以匹配类型。
3) Match从上往下匹配,匹配上之后,自动停止。
4) Match匹配过程中有数据类型转换。
5) case _ =>{xxx} 什么都匹配不上才匹配,放在最后一行。
6) 方法体中只有match模式匹配,可以将xx match {xxx} 整体看成一行
1) 类似于java中的switch … case … ,是模式匹配的特殊情况,只能匹配一种类型,对应出来一种类型。
def fun:PartialFunction[Int,String] = {
case 1 =>{
... ...;“hello”}
case 2 =>{
... ...;“scala”}
case _ =>{
“default”}
}
1) 使用关键字case修饰的类就是样例类
2) 样例类可以new 可以不用new。
3) 样例类实现了toString,equles,hash…方法
4) 样例类参数默认就是类的属性,自带getter,setter方法。
1) 使用关键字implicit修饰的值就是隐式值。
2) 方法中参数使用implicit修饰,这个参数就是隐式参数。
3) 一个方法中部分参数是隐式的,必须使用柯里化的方式定义