scala的比较是对于内容的比较;
<-被称为生成器,集合遍历
1 to 5==1.to(5)
没有break,如果需要break,需要调用scala相应的包;
for循环可以后面接yield i来循环遍历返回一个集合,作为一个表达式;
var x=for(i<-1 to 5) yield
scala集合分为可变集合和不可变集合,可变集合在增删改查之后返回的是新的集合;
scala中表示所有类不是*,而是_;
方法也是对象;
默认使用immutable不可变,要想使用mutable,先导包;
追加多个元素使用a+=(afsd,adfasdf,dfasdf)
追加数组,表等,使用a++=(234,34,342,1,34,3)
a.trimEnd(n)删除末尾n个元素;
整型的还有其他的例如insert remove 参数1为起始位置,后面的参数为操作的数据;
:: 连接符;
map初始化key->value;
lazy 只能修饰val在调用时赋值;
如果函数最后一行为函数返回值,可以省略return
函数也是对象,可以当做变量一样来赋值;
这种函数为值函数;
val sum=(x:Int,y:Int)=>{println(x+y) x+y}
其中=>为函数映射符,将左边的某种类型转换为右边的某种类型;
值函数的返回值是进行函数推断之后得来的,并且值函数的参数在右边只出现一次,可以用_进行优化;
还可以省去参数类型,类型由编译器推断;
值函数,函数头可以当做一个变量,然后以变量名的方进行调用,=>之后写函数体;
函数被当为类,被编译器编译成一个字节码文件,然后当调用时会生成一个对象;
当建立数组等时,不指定类型,会根据元素类型来匹配类型;
高阶函数中,参数列表用X:(Double)=>指明参数函数的输入返回类型;
高阶函数即参数列表可以是函数,函数嵌套;
闭包:闭包是由函数和运行时数据组成的,理解为函数和上下文(上下文为自由变量);高阶函数也可以理解为一种闭包;闭包中自由变量的值的不同,会导致结果不同;含有可变量的函数,可插拔函数组件的函数对象;
函数的柯理化
高阶函数可以返回一个函数;
柯理化函数可以定义为def aa(x:Int)(y:Int)=x*y,单独只用一个变量是不行的,必须使用初始化两个,如果不,则报错,也可以使用_在相应位置做占位,形成新的函数;
类与对象:使用class来定义对象,但是没有访问修饰符;
并且在类中定义变量,必须初始化,否则会报错,不初始化要声明为抽象类;
还可以用占位符来初始化;
通过Object 关键字来声明单例对象;main方法必须在单例对象之中;def main(args:Array[String])
;当定义了变量之后,编译会自动生成getter和setter方法;当在外调用属性时,实际时调用了对应的get,set方法;没有加关键字的属性默认编译为private;创建对象也时用new,无参构造可以省略括号;x.dd_()方法为dd的seter,getter方法;在类中定义属性时加上注解@BeanProperty会自动定义java风格的set和get方法,当然也有scala风格的;单例对象实际上时使用了java的单例模式和静态类成员来实现的;但是它没有静态类成员这一语法;单例对象不用new,而是直接定义运行,类似java的静态类;而且还时动态的;
应用程序对象:可以通过在单例对象中定义main方法来定义为应用程序对象,或者某个对象继承于App,就可以在该对象中直接写可执行代码;
伴生类和伴生对象:在对象中定义一个类,则互为伴生类和伴生对象,可以便于控制访问控制权限;
主构造函数的定义:只需要在类内定义需要执行的代码,当创建时就会调用,并且自动生成相应的set,get方法,和有参构造函数;定义有参构造函数直接在定义类的后面定义;还可以定义参数的默认值,在类的参数列表中指定全部或者部分的默认值,就可以在new对象的时候构造函数省略括号;
如果需要创建私有的主构造函数,需要在参数列表前加private修饰符,例如:class x private(var name:String,var age:Int)
在定义构造函数的时候需要指定时变量还是常量;
辅助构造函数使用this关键字 def this(name:String){ }在定义时不用加var;也有自动匹配机制;也可以像主构造函数一样定义参数默认值,但是得在之前调用主构造函数;
new一个对象的时候优先调用无参主构造函数,如果主构造函数调用失败比如说定义修饰为私有的主构造函数,则会在new的时候调用默认无参辅助构造函数;
继承与多态:继承方式和c++类似,在继承时声明所继承的构造函数的参数列表;并且在new一个对象的时候是先调用父类的主构造函数,之后调用子类的构造函数;方法重写:使用override关键字override def toString(); 和java类似,子类的引用指向了可以指向父类变量,并且调用的方法实际上是子类的;
成员访问控制:和java的访问修饰符类似,但是scala默认的范围为public,没有package,定义的protected变量的set,get方法是public的,但是定义的private类型的变量,set,get方法都是private的,并且,@BeanProperty只能在非private变量上使用; scala还有private[this]关键字修饰符,表示该变量只能在类内访问,不能被外部访问,伴生对象也不能访问;private[this]和private的区别主要在前者不能被伴生对象访问,后者可以;
抽象类的定义:抽象类和java类似,但是scala中的抽象变量可以不初始化;
内部类,内部对象,匿名类都与java类似;
trait:类似与java的接口,可以实现多继承,但是内容类似与java的抽象方法,trait中可以有抽象方法,抽象属性,具体方法,具体属性;单个实现trait可以使用extends,with,实现多个trait只能使用with;实现提前加载避免空指针,使用lazy关键字修饰,可以在使用该变量时初始化;
包的定义和java类似;包对象:对象前面有package关键字修饰的为包对象,其中定义了方法属性,主要用来对常量和工具函数的封装;直接用包名.xx来访问;
import高级特性:隐式引入默认引入java.lang和scala.Predef所有类和方法;可以将引入的包重命名,命名方式为import xxxxx.(dddd=>sfdadf)
类隐藏:import xxx.(dddd=>_,_)隐藏该类,避免冲突;
模式匹配
scala中的匹配模式类似于switch,使用为:变量名为x,则 x match{ case 1=>表达式
case x if(x%2==0) =>表达式
case _ =>表达式 (通配所有)
使用=> 匹配模式还可以直接定义匹配val (x,y)=(1,4) 通配为两个整数;通配的值语句可以是表达式,结果可以是返回值;
模式匹配还可以作为函数体,匹配结果可以自动成为返回值;
匹配模式分为常量模式和变量模式,常量模式中case 匹配值为常量,变量模式匹配的是该匹配变量,变量进行条件判断等来匹配;
构造函数模式: 构造函数的反解析,在定义了个对象之后,然后定义匹配模式,来匹配构造函数的相应参数,来获得相应的参数;不需要匹配的参数使用_来代替;
序列模式:用来匹配数组,可以提前定义号序列的变量名,在匹配的时候进行自动解析;析取相应的值,就像key,value;_匹配一个元素,_*匹配剩下的若干元素;
元组模式:和序列类似;
类型匹配:为匹配变量定义不同的类型来匹配 case x:String => xxxx case x:Int=> xxdd
变量绑定模式:如果在匹配模式中想要匹配的是对象而不是析取对象,则需要在匹配的时候使用返回匹配变量名@匹配类型=>dddd;
<-被称为生成器,集合遍历
1 to 5==1.to(5)
没有break,如果需要break,需要调用scala相应的包;
for循环可以后面接yield i来循环遍历返回一个集合,作为一个表达式;
var x=for(i<-1 to 5) yield
scala集合分为可变集合和不可变集合,可变集合在增删改查之后返回的是新的集合;
scala中表示所有类不是*,而是_;
方法也是对象;
默认使用immutable不可变,要想使用mutable,先导包;
追加多个元素使用a+=(afsd,adfasdf,dfasdf)
追加数组,表等,使用a++=(234,34,342,1,34,3)
a.trimEnd(n)删除末尾n个元素;
整型的还有其他的例如insert remove 参数1为起始位置,后面的参数为操作的数据;
:: 连接符;
map初始化key->value;
lazy 只能修饰val在调用时赋值;
如果函数最后一行为函数返回值,可以省略return
函数也是对象,可以当做变量一样来赋值;
这种函数为值函数;
val sum=(x:Int,y:Int)=>{println(x+y) x+y}
其中=>为函数映射符,将左边的某种类型转换为右边的某种类型;
值函数的返回值是进行函数推断之后得来的,并且值函数的参数在右边只出现一次,可以用_进行优化;
还可以省去参数类型,类型由编译器推断;
值函数,函数头可以当做一个变量,然后以变量名的方进行调用,=>之后写函数体;
函数被当为类,被编译器编译成一个字节码文件,然后当调用时会生成一个对象;
当建立数组等时,不指定类型,会根据元素类型来匹配类型;
高阶函数中,参数列表用X:(Double)=>指明参数函数的输入返回类型;
高阶函数即参数列表可以是函数,函数嵌套;
闭包:闭包是由函数和运行时数据组成的,理解为函数和上下文(上下文为自由变量);高阶函数也可以理解为一种闭包;闭包中自由变量的值的不同,会导致结果不同;含有可变量的函数,可插拔函数组件的函数对象;
函数的柯理化
高阶函数可以返回一个函数;
柯理化函数可以定义为def aa(x:Int)(y:Int)=x*y,单独只用一个变量是不行的,必须使用初始化两个,如果不,则报错,也可以使用_在相应位置做占位,形成新的函数;
类与对象:使用class来定义对象,但是没有访问修饰符;
并且在类中定义变量,必须初始化,否则会报错,不初始化要声明为抽象类;
还可以用占位符来初始化;
通过Object 关键字来声明单例对象;main方法必须在单例对象之中;def main(args:Array[String])
;当定义了变量之后,编译会自动生成getter和setter方法;当在外调用属性时,实际时调用了对应的get,set方法;没有加关键字的属性默认编译为private;创建对象也时用new,无参构造可以省略括号;x.dd_()方法为dd的seter,getter方法;在类中定义属性时加上注解@BeanProperty会自动定义java风格的set和get方法,当然也有scala风格的;单例对象实际上时使用了java的单例模式和静态类成员来实现的;但是它没有静态类成员这一语法;单例对象不用new,而是直接定义运行,类似java的静态类;而且还时动态的;
应用程序对象:可以通过在单例对象中定义main方法来定义为应用程序对象,或者某个对象继承于App,就可以在该对象中直接写可执行代码;
伴生类和伴生对象:在对象中定义一个类,则互为伴生类和伴生对象,可以便于控制访问控制权限;
主构造函数的定义:只需要在类内定义需要执行的代码,当创建时就会调用,并且自动生成相应的set,get方法,和有参构造函数;定义有参构造函数直接在定义类的后面定义;还可以定义参数的默认值,在类的参数列表中指定全部或者部分的默认值,就可以在new对象的时候构造函数省略括号;
如果需要创建私有的主构造函数,需要在参数列表前加private修饰符,例如:class x private(var name:String,var age:Int)
在定义构造函数的时候需要指定时变量还是常量;
辅助构造函数使用this关键字 def this(name:String){ }在定义时不用加var;也有自动匹配机制;也可以像主构造函数一样定义参数默认值,但是得在之前调用主构造函数;
new一个对象的时候优先调用无参主构造函数,如果主构造函数调用失败比如说定义修饰为私有的主构造函数,则会在new的时候调用默认无参辅助构造函数;
继承与多态:继承方式和c++类似,在继承时声明所继承的构造函数的参数列表;并且在new一个对象的时候是先调用父类的主构造函数,之后调用子类的构造函数;方法重写:使用override关键字override def toString(); 和java类似,子类的引用指向了可以指向父类变量,并且调用的方法实际上是子类的;
成员访问控制:和java的访问修饰符类似,但是scala默认的范围为public,没有package,定义的protected变量的set,get方法是public的,但是定义的private类型的变量,set,get方法都是private的,并且,@BeanProperty只能在非private变量上使用; scala还有private[this]关键字修饰符,表示该变量只能在类内访问,不能被外部访问,伴生对象也不能访问;private[this]和private的区别主要在前者不能被伴生对象访问,后者可以;
抽象类的定义:抽象类和java类似,但是scala中的抽象变量可以不初始化;
内部类,内部对象,匿名类都与java类似;
trait:类似与java的接口,可以实现多继承,但是内容类似与java的抽象方法,trait中可以有抽象方法,抽象属性,具体方法,具体属性;单个实现trait可以使用extends,with,实现多个trait只能使用with;实现提前加载避免空指针,使用lazy关键字修饰,可以在使用该变量时初始化;
包的定义和java类似;包对象:对象前面有package关键字修饰的为包对象,其中定义了方法属性,主要用来对常量和工具函数的封装;直接用包名.xx来访问;
import高级特性:隐式引入默认引入java.lang和scala.Predef所有类和方法;可以将引入的包重命名,命名方式为import xxxxx.(dddd=>sfdadf)
类隐藏:import xxx.(dddd=>_,_)隐藏该类,避免冲突;
模式匹配
scala中的匹配模式类似于switch,使用为:变量名为x,则 x match{ case 1=>表达式
case x if(x%2==0) =>表达式
case _ =>表达式 (通配所有)
使用=> 匹配模式还可以直接定义匹配val (x,y)=(1,4) 通配为两个整数;通配的值语句可以是表达式,结果可以是返回值;
模式匹配还可以作为函数体,匹配结果可以自动成为返回值;
匹配模式分为常量模式和变量模式,常量模式中case 匹配值为常量,变量模式匹配的是该匹配变量,变量进行条件判断等来匹配;
构造函数模式: 构造函数的反解析,在定义了个对象之后,然后定义匹配模式,来匹配构造函数的相应参数,来获得相应的参数;不需要匹配的参数使用_来代替;
序列模式:用来匹配数组,可以提前定义号序列的变量名,在匹配的时候进行自动解析;析取相应的值,就像key,value;_匹配一个元素,_*匹配剩下的若干元素;
元组模式:和序列类似;
类型匹配:为匹配变量定义不同的类型来匹配 case x:String => xxxx case x:Int=> xxdd
变量绑定模式:如果在匹配模式中想要匹配的是对象而不是析取对象,则需要在匹配的时候使用返回匹配变量名@匹配类型=>dddd;