Scala个人总结
1 不可变类型中除了Array类型直接打印是地址值,需要转为可变集合ArrayBuffer再打印以外,其他所有集合直接打印都是打印集合中的内容,并且不可变集合中只有Array类型是内容可变,长度不可变的,其他都是长度和内容都不可变.
元组中的元素全部为不可变的
2 val list2: List[Int] = 1::2::3::Nil
表示把1,2,3放到一个空列表Nil中,再赋值给list2
3 list3 ++= list4
表示把list3和list4中的内容加到再一起赋值给list3
4 无论是可变集合转不可变,还是不可变集合转可变 ,都是赋值后的结果集合发生了改变,自身并没有改变.
5 集合中所有创建对象的方式都是利用Scala的特性,即不需要new对象,比如创建List对象只需要调用 List.apply() 方法即可创建对象,其中.apply可以省略,所以直接 List() 即可创建List对象.
6 Map.get()方法可以返回一个Option对象,如果有相应key的话就返回一个值,通过进一步get可以拿出来,没有的话就报错
7 所有集合的函数式API,无论是遍历还是映射,均不会改变原来集合中的元素,只是针对原来的集合中的元素做一些操作然后返回一个执行完成的结果集合罢了。
8 flatten是直接将多维数组压扁转换为一维数组,flatMap是先将需要切分的字符串切分成一个个的元素,再将多维数组压扁成一维数组
9 定义一个属性, _可以表示占位符,修饰词必须为var,因为属性肯定需要重新赋值,并且需要指定数据类型,因为没有值scala无法自动判断出数据类型.并且会给与一个默认值,如果一个属性没有赋值也没有_就相当于没有任何值,就相当于是一个抽象属性,只能被定义在抽象类中.
10 @BeanProperty可以给属性生成getter setter方法,scala默认是没有的
11 构造器参数可以带或者不带val/var,如果带val/var的参数会被作为字段, 如果作为了字段,类里就不需要再定义相同的属性了,属性没有值也没关系,调用构造的时候直接赋值即可
如果不带val/var的参数,不会被作为字段,仅仅能被主构造器中的语句使用.
辅助构造器必须里面得调用主构造器或其他的辅助构造器,并且必须放在第一行,说白了无论怎样最后都需要调用主构造器,只不过传入的参数可以改变,比如
class Person3(val id:Int,var name:String ){
println("主构造器执行了")
//定义一个辅助构造器,里面得调用主构造器或其他的辅助构造器(必须放在第一行)
def this(){
this(100,"jack")
println("空参数辅助构造器执行了")
}
def this(name:String){
this(100,name)
println("带参数辅助构造器执行了")
}
}
可以看出有了辅助构造器之后,我们创建对象的参数可以不同,但是其实最后都是调用了主构造器.
12 子类继承父类时,父类中的属性如果是val修饰,如果想要更改这个属性的值,必须用override修饰,相当于重新定义了一个同名的属性把父类中的属性覆盖了,如果是var修饰,直接赋新的值即可.(父类中var修饰的属性不可以用override关键字覆盖)
13 在抽象类中可以写带参构造,trait和object类中没有都没有带参构造,object类可以直接通过类名.的方式调用属性和方法,不需要创建对象,所有根本不需要我们去自己写带参构造
14 样例类 case class类似java中的pojo类,可以自动帮我们生成toString,equals,hashCode和apply等方法,其中eq()才是比较两个对象的地址值,equals和==均是调用hashCode方法比较属性值是否相等.
15 如果父类没有无参构造,那么子类继承父类之后,自己的主构造器中必须包括父类任意一个构造器的参数,因为创建子类对象必须要先实例化父类对象,而父类对象的实例化需要参数,所以必须在子类的主构造器中包括父构造器的参数.
这样的话我们创建一个子类对象时就必须把父类的构造方法里的参数也指定上,这样就可以保证可以在构建子类对象前能先实例化父类对象.
本文地址:https://blog.csdn.net/weixin_47116289/article/details/111826504