scala 学习笔记
刚开始就是有个点写个点,比较乱
学习完一个阶段在做整理
1.在scala中用方法转换数据类型,而不是用强制转换,如99.toInt
2. 常见的运算符 + - * / %其实是方法,a+b 是a.+b或a.+(b)
1.to(10) 可以写成 1 to 10
3.数据自增自减没有++,--需要用+=1和-=1
4.不带参数的方法可以不带() 如"hello".distinct
5.scala api 中C是类O是伴生类即静态类
6.避免用return、做好模式匹配(异常处理)【在函数中用return相当于break】
//这个函数不会返回值 def getsum(n1:Int,n2:Int)={ val sum=n1+n2 } //这个才会返回sum def getsum(n1:Int,n2:Int)={ val sum=n1+n2 sum } //当然也能这样用 def getsum(n1:Int,n2:Int) :Int={ val sum=n1+n2 return sum }
//这个println("aaa")不会执行
def getsum(n1:Int,n2:Int){
val sum=n1+n2
return
println("aaa")
}
7.scala的类型推导 var a = x>3 ? "hello" : 100 可以返回不同的类型值
8.scala的返回类型 Unit写做(),表示一个”无值”的值
9.以赋值语句结尾的{}代码块,如{r=r*n;n-=1}的值是Unit类型,也就是没有值,什么都不返回
10.从控制台读入数据readline,也可以用readInt等等--readline可以带参数作为默认提示
11. 0 util s.length 等效于0到s.length -1 不含上限
12.
13.for/yield 如果for循环体以yield开始,则会构造出一个集合,每次迭代会构造出集合中的一个值
14.
class
Person(name:String ,age:Int)
//不带val,也不带var,只有构造器,没有get,set方法
class
Person(val name:String ,val age:Int)
//用val标记,有get,没set
class
Person(var name:String ,var age:Int)
//用var标记,get,set都有
apply是scala中的语法糖:对一个对象obj上调用obj(),scala编译器会转换为obj.apply();
在一个类clazz上调用clazz(),scala编译器会转换为clazz_company_obj.apply(),其中clazz_company_obj为clazz的伴生对象。
就是相当于java的构造,会生成一个实例
16.变长参数
def sum(args: Int*)={//ToDo}
变长参数如果传个sum(1 to 5) 会把1 to 5 当成元素报错,正确用法加:_* 就会当成序列了
sum(1 to 5:_*)
17.数组和缓冲数组提供了一个"加强"版的toString方法,mkString可以指定分隔符,前缀后缀。
18.scala.collection.javaConversions 里有隐式转换,方便java 和scala的数组集合自动转换。
19.方法或函数的参数在内部无法自增自减,需要先赋值给一个内部临时变量,才能操作。
20.创建映射Map用—> 和()都可以,也可以用java的put,
var map2=("a"->1,"b"->2)
var map3=(("a",1),("b",2))
21.去值的时候可以和数组一样map2("a"),也可以map2.get("a")
22.增删改
map("a")=100 //改
map+=("c"->3)//增
map-="c" //删
java以前的put,remove也可以用
23.迭代 for((k,v)<-map){//ToDo}
24.java scala相互转换
25.映射的遍历 for((k,v) <- 映射) TODO
26.无参数的方法可以加(),也可以不加,建议是改值的时候加,取值的时候不加--这种风格
27.scala中的get/set方法
28.用注解生成get/set方法
29.创建数组加不加new的问题
30.scala里的类、类的对象
class 是定义类, object 伴生对象 --伴生 跟着同名的class走的 --对象 创建类对象的时候,默认是调用同名object的apply创建对象的。
31.App特质
在调用过程中特质先于单例对象构建,特质的main方法的调用和单例对象的调用有关
32.包的引入
33.子类调用父类的方法
supper.xxx
34.子类重写父类的字段
35.Source.stdin控制台输入
36.序列化
@SerialVersionUID(100l) class Person extends Serializable{ }
@SerialVersionUID(100l) 可以不写,用默认UID
37. scala.sys 获取系统参数什么的
38.scala进程控制 和shell互交
导入import sys.process._ 包
符号
!(返回0和错误代码)
!! (返回执行结果的字符串)
#|(管道)
#> (重定向) 等等。。
import sys.process._ //var cmd="hadoop fs -ls /user" linux没试,windows下这个没什么鸟用 var cmd="java -version!" var tmp = Process(cmd) println(tmp.toString())
39.正则,replace变的高级了
40.特质 --一个更好用的像类也像接口的一个东西
40.1 抽象方法不需要用 abstract修饰,默认没有实现的方法就是抽象类,重写抽象方法也不需要加override关键字
40.2构造对象的时候也可以加入特质--牛逼了吧!
40.3 特质的构造顺序
40.4 特质和类
41.结合性
42.数组和映射(map)的apply和update方法
43.构造类对象的时候,什么时候用new 构造,什么时候可以不用new --重点在该类伴生对象的apply方法
有它即可不用new去构造对象。