寒假学习记录9_Scala面向对象编程基础4
我的学习笔记如下:
46、特质(Trait)是代码重用的基本单元,可以同时拥有抽象方法和具体方法。
47、特质类型的变量会根据绑定的对象调用合适的方法。
48、最常见的匹配模式是match语句,match语句用在需要从多个分支中进行选择的场景。
49、与Java的switch不同的是,match结构中不需要break语句来跳出判断,Scala从前往后匹配到一个分支后,会自动跳出判断。
50、case后面的表达式可以是任意类型的常量,而不要求是整数类型。
51、match除了匹配特定的常量,还能匹配某种类型的所有值。
52、类似for表达式中的守卫式,也可以在match表达式的case中使用守卫式添加一些其他的过滤逻辑。
例:
case _ if (elem%2==0) => ...
case _ => ...
53、当定义一个类时,如果在class关键字前加上case关键字,则称该类为case类。
54、Scala为case类自动重载了许多实用的方法,包括toString、equals、和hashcode方法,其中,toString会返回形如“类名(参数列表)”的字符串。
55、Scala会为每一个case类自动生成一个伴生对象,在该伴生对象中自动生成的模板代码包括:
①一个apply方法,因此,实例化该类的时候无需使用new关键字。
②一个unapply方法,该方法包含一个类型为伴生类的参数,返回的结果是Option类型,对应的类型参数是N元组,N是伴生类中构造器参数的个数。
56、对case而言,除了可以在match表达式中进行模式匹配,还可以在定义变量时直接从对象中提取属性值。
例:
val Car (brand,price) = BMW
val Car(_,prince) = BMW
57、Scala采用包(Package)来层次化、模块化地组织程序。包可以包含类、对象和特质的定义,但是不能包含函数或变量的定义。
58、可以通过两种方式把代码放在命名包中:
①把package子句放在源文件的顶端,这样后续所有的类和对象都位于该命名包中。
例:
package autodepartment
class MyClass
与Java不同的是,Scala的包和源文件之间没有强制的一致层次关系,这意味着,上述源文件不需要放在名为autodepartment的文件夹下。
②在package子句之后加一对大括号,再将相关的类及对象放到大括号里。
59、Scala的包定义支持嵌套,相应的作用域也是嵌套的,在包内可以直接访问其父级包内定义的内容。
60、包和其成员可以用import子句来引用,这样可以简化包成员的访问方式。
61、与Java不同的是,Scala的import语句并不一定要写在文件顶部,它可以出现在程序的任何地方,其作用域从import语句开始一直延伸到包含该语句的块的末尾。
62、如果将函数作为“头等公民”看待,函数也应该有“类型”和“值”的区分,“类型”需要明确函数接受多少个参数、每个参数的类型以及函数返回结果的类型;“值”则是函数的一个具体实现。
例:
val counter: (Int) => Int = { value => value + 1}
63、当一个函数包含其他函数作为其参数或者返回结果为一个函数时,该函数被称为高阶函数。
64、当函数的执行依赖于声明在函数外部的一个或多个变量时。则称这个函数为闭包。
65、只保留了函数部分参数的函数表达式,称为偏应用函数。如果要保留整个函数列表,可以直接用一个下划线代替。
66、Curry化的函数是指那种带有多个参数列表且每个参数列表只包含一个参数的函数。
67、针对容器的操作:遍历、映射、过滤、规约。
浙公网安备 33010602011771号