48-Scala-函数式编程:
函数式编程
1、完全面向对象编程
2、函数式编程,万物皆函数,程序语句的集合,称为函数。类中的函数称之方法。函数无重载重写概念,方法可以。函数可以嵌套
3、函数的定义def test3(s:String):Unit={ println(s) }
4、函数参数,可变参数,多个参数时可变参数放置在最后,参数可设置默认值,可通过参数名对参数赋值
5、至简原则,能省就省略。return可以省略最后一行为返回值。方法体少了花括号可以省略,无返回值可省略=号以及返回类型和unit,如果只关心逻辑,不关心名称,def也可省略(匿名函数,lambda表达式)。(name:String) => { println(name)}
6、高阶函数,函数可以作为值/参数/函数返回值进行传递
7、匿名函数,没有名字的函数就是匿名函数。(x:Int)=>{函数体} x:输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑
地址:\big-data-study\Scala-demo\src\main\scala\zh\myscala01\chapter03
8、函数柯里化&闭包,Test08_ColsureAndCurrying
闭包:如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包(下图基本大体了解)
函数柯里化:把一个参数列表的多个参数,变成多个参数列表
9、递归:一个函数/方法在函数/方法体内又调用了本身,我们称之为递归调用,Test09_Rescrsion
10、控制抽象:值调用,把计算后的值传递过去。名调用,把代码传递过去 Test10_ControlAbstraction
11、惰性加载:当函数返回值被声明为 lazy 时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。注意:lazy 不能修饰 var 类型的变量
面向对象:
1、包:package 包名,区分相同名字的类,很好的管理类,控制访问范围。
方案一:com.atguigu.scala。
方案二:一个源文件中可以声明多个 package,子包中的类可以直接访问父包中的内容,而无需导包
package com{
package atguigu{
package scala{
}
}
}
2、 包对象:在 Scala 中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对应包下所有 class 和 object 的共享变量,可以被直接访问。如采用嵌套方式管理包,则包对象可与包定义在同一文件中,但是要保证包对象与包声明在同一作用域中。
3、导包(不用记,了解有即可):
1)和 Java 一样,可以在顶部使用 import 导入,在这个文件中的所有类都可以使用。
2)局部导入:什么时候使用,什么时候导入。在其作用范围内都可以使用
3)通配符导入:import java.util._
4)给类起名:import java.util.{ArrayList=>JL}
5)导入相同包的多个类:import java.util.{HashSet, ArrayList}
6)屏蔽类:import java.util.{ArrayList =>,}
7)导入包的绝对路径:new root.java.util.HashMap
4、定义类和属性等,等同java
5、访问权限,Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。private 为私有权限,只在类的内部和伴生对象中可用。protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以访问,同包无法访问。private[包名]增加包访问权限,包名下的其他类也可以使用
6、封装,构造器:辅助构造器,构造器参数,函数的名称 this,可以有多个,编译器通过参数的个数及类型来区分。辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。构造器调用其他另外的构造器,要求被调用构造器必须提前声明。Test02_Constructor,Test05_ConstrctorParams
7、封装,继承和多态,Test06_Inherit,其中多态,java属性静态绑定,方法动态绑定,scala属性和方法都是动态绑定。
8、抽象类,abstract class Person{} ,抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性,抽象方法:def hello():String //只声明而没有实现的方法,就是抽象方法。继承&重写。Test08_AbstractClass
9、匿名子类,和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。Test9_AnnoymousClass
10、伴生对象(单例对象),Test10_Object,Test11_Singleton
(1)伴生对象的 apply 方法,可不使用 new 方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上 private。
(3)apply 方法可以重载。
(4)new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的 apply 方法。
11、特质(Trait)
1)trait 中即可有抽象属性和方法,也可有具体的属性和方法,一个类可以混入(mixin)多个特质。类似于 Java 中的抽象类。
引入 trait一可替代 Java 接口,二是对单继承机制的一种补充。
2)没有父类:class 类名 extends 特质 1 with 特质 2 with 特质 3 …
有父类:class 类名 extends 父类 with 特质 1 with 特质 2 with 特质 3…
12、动态混入:可灵活的扩展类的功能,创建对象时混入trait,而无需使类混入该trait,new object whit trait
13、特质的叠加:顺序,从右到左叠加
(1)案例中的 super,不是表示其父特质对象,而是表示上述叠加顺序中的下一个特质,即,MyClass 中的super指代 Color,Color 中的super指代Category,Category中的super指代 Ball**。**
(2)如果想要调用某个指定的混入特质中的方法,可以增加约束:super[],例如super[Category].describe()。
14、特质和抽象类的区别
1.优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。
2.如果需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而特质不行(有无参构造)。
15、自身类型:自身类型可实现依赖注入的功能
16、类型检查和转换,obj.isInstanceOf[T]: obj 是不是 T 类型。obj.asInstanceOf[T]: obj 强转成 T 类型。classOf 获取对象的类名。
17、枚举类:需要继承 Enumeration。应用类:需要继承 App
18、Type 定义新类型,使用 type 关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名
: obj 强转成 T 类型。classOf 获取对象的类名。
17、枚举类:需要继承 Enumeration。应用类:需要继承 App
18、Type 定义新类型,使用 type 关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230