【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型

重点版

【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型

 详细版【Scala复习】基础知识、函数式编程、面向对象、集合、隐式转换、模式匹配、泛型

 

基础知识常量和变量尽量使用常量val别使用变量var变量的命名数字字母下划线_特殊的用法数据类型java基本数据类型引用数据类型scalaAny-对象的根类AnyVal-数值类型LongInt...StringOps使用String的时候, 有些情况会通过隐式转换☆的形式到这个类型Unit类似java的voidAnyRef-引用类型Java中所有的类, 到scala中都属于AnyRefscala的所有集合定义的所有的类Null只有一个nullNothing任意类型的的子类如果抛异常, 则返回类型是Nothing没有对象, 也没有子类. 数据之间的转化值类型的转换.toInt.toLong...AnyRef类型的转换判断:.isInstanceof[...]强制类型转换:.asInstanceof[...]流程控制顺序选择if  else if  else※val max = if(m >n)  m  else n模式匹配:根据不同的case选择循环whiledo ...while很少使用for(i <- 1 until n + 1)常用在集合:本质上是一种遍历或迭代去遍历一个序列(集合, 字符串...)守卫(条件判断式)for(i <- 1 to 3 if i != 2) 嵌套...for推导val nums = for(i <- 1 to 100)  yield i * i集合中:val nums = (1 to 100).map(x => x * x)  使用map算子替换上面【函数式编程】循环的退出抛异常自己抛, 自己捉.  try  catchscala'提供的模板Breaks.xxx完成breakbreakable {xxx}把循环放在函数内, 使用return结束函数, 从而结束循环运算符在scala中没有真正的运算符, 所有的运算符都是方法名1 + 2  ==== 1.+(2)结合性左结合数学运算符右结合: 结尾::--list添加元素:::--两个list做并集/:左折叠+:赋值号a = 3 + 4
函数式编程☆基本概念函数是一等公民(做参数、做返回值)纯函数是追求的目标,好处是天然的高并发、安全,不会出现共享变量没有副作用对外界不产生影响引用透明返回值只依赖参数, 不依赖任何的外部数据过程只有副作用, 没有返回值如:main函数,def main(args: Array[String]): Unit = {xxx}基本用法定义def sum(a:Int, b:Int)参数参数都是val常量☆参数的默认值有默认值的放在后面age : Int = 30命名参数def test4( sex : String = "男", name : String ): Unittest4(name="ximenqing")返回值返回值可以省略, scala会自动推导内部不能有return返回Unit高阶函数概念参数接受一个或多个函数, 或者返回值是函数如何传递给高阶函数传递函数匿名函数(  )  => 函数实现( a: Int, b:Int ) => a + b传给高阶函数的时候参数类型可以省略( a, b) => a + b简化原则【至简】用下划线进行化简参数只用一次, 可以用_ 简写arr.reduce( _ + _)闭包匿名函数和他的环境【访问外部变量的环境时】延长局部变量的声明周期def foo(): () => Int{val a = 10(  ) => a + 20【闭包】,并且匿名函数作为返回值 }
val f = foo(  )f( )---表示内部的匿名函数柯里化☆理论基础是闭包把一个参数列表变成多个参数列表部分应用函数val f = math.pow(_, 2)省略的时候, 有些时候不能省略, 可以用部分应用函数来解释Array(1,2,3).map(x => x)Array(1,2,3).map(_)Array(1,2,3).map(+_)def foo( 必传的参数)( 隐式参数 ),需要调用两次!抽象控制名调用和值调用名调用控制抽象的理论基础f( 3 + 4)3 + 4这个表达式传递过去, 没有先计算def f(  op:  => Unit )f {// 代码
}值调用f (3 + 4)等价于f(7)def f(op:  ( ) => Unit)f(  () => {//代码})
面向对象思想和java一样类的定义构造函数主构造位置和类名在一块class User(val age: Int, var name: String, sex: String){    // 代码    println("主构造")        // 辅构造    def this(){                // 首行必须是主构造        this(10, "b", "F")☆☆☆            }    // a是一个只能在当前的构造函数内用的普通的常量    def this(a: Int){        this()        println(a)    }    def foo()= {        println(sex)  // 更加函数式        println(this.sex)  // 更加面向对象            }}辅助构造主构造内部包括的是辅助构造访问权限默认都是公共包导包及其灵活创建package,导入import封装属性的封装自己格式的getter和setter@BeanProperty可以添加java格式的标准bean伴生对象和伴生类object和class的名字相等特点1. 他们必须在同一文件中2. 可以互相访问对方的私有成员apply任何对象都可以像调用函数一样去调用对象!!!package com.atguigu.scala1015
/** * Author atguigu * Date 2020/4/10 10:35 */object ApplyDemo {    def main(args: Array[String]): Unit = {        val a = new A        a.foo()        a(10)   // 等价于 a.apply(10)                A()  // A.apply()    }}object A{    // 一般是返回伴生类的对象. 好处就是创建伴生类对象的时候, 可以省略new    // 样例类就是这么玩    def apply() = {        println("A apply...")    }}
class A{    def foo(): Unit ={        println("foo...")    }        def apply(n:Int) = {        println(n)    }}
继承extendsoverride 重写方法的重写两同方法名参数列表两小返回值类型抛出的异常类型一大访问权限属性的重写val可以重写val和没有参数的defvar只能重写抽象的var抽象类abatract修饰抽象函数只有函数的签名, 没有函数体抽象字段只有声明, 没有初始化trait采用特质/特征代替接口的概念extends 父类  with 特质1 with 特质2=抽象类+接口动态混入:创建对象时混入,而无需使类混入特质叠加:解决多个混入的特质包含的相同方法,如"blue-" + super.describe()样例类apply构造和unapply返回用来完全的去替换掉了java的bean配合模式匹配, 功能很强
集合☆☆整体架构不可变集合immutableSeqList空List[Int](   )Nil:: 在头部添加元素:::在头部合并集合Array--IndexSeq转换arr1.toBuffer/toArraySet空Set[Int]( )交集并集差集Map空Map[String, String]( )val value = map(key)key不存在会抛异常val opt: Option[Int] = map.get(key)有值some,无值nonemap.getOrElse(30, 100)元组val tuple: (Int, String, Boolean) = (40,"bobo",true)tuple._2/tuple.productElement(0)/迭代器可变集合mutable类似Java的StringBuilder,不会返回新对象ArrayBufferval arr01 = ArrayBuffer[Any](1, 2, 3)ListBufferCRUD方法mutable.Setmutable.Mapval map = mutable.Map( "a"->1, "b"->2, "c"->3 )TreeSetSet集合, 他兄弟HashSet可以给存入他的元素进行自动排序TreeMap按照map的key来进行操作通用的方法或函数简单       println(list1.head)  // 拿出来第一个        println(list1.last)  // 拿出来最后一个        println(list1.tail)  // 干掉第一个        println(list1.init)  // 干掉最后一个        println(list1.take(2))  // 取出来前3个        println(list1.drop(2))        println(list1.takeRight(2))        println(list1.dropRight(2))复杂高级算子foreachmapflatMapreducefoldLeftscanLeftzipzipzipAllzipWithIndex排序sortedsortWithsortBy(x => x.abs)掌握偏函数applyOrElse根据输入参数返回不同结果wordCount手写Option特殊类型Option(选项):有值(Some),无值(None)Either
隐式转换隐式转换函数用于扩展某个类的功能implicit  def ...隐式转换函数, 只看参数的类型和返回值类型, 不管函数名隐式值类是对隐式转换函数的升级版, 或者是个语法糖隐式参数和隐式值柯里化的时候, 这块几乎用的比较多语法糖的:  泛型上下文查找的路径当前作用域相关类型的伴生对象中
模式匹配(替换if else)x match {case => xxx}类型匹配集合的内容匹配对象匹配对样例类进行匹配样例类:object 的apply和unapply方法偏函数
泛型能够看懂别人的泛型代码泛型的3变不变[A]协变[+A]子类逆变[-A]父类只会用简单泛型泛型类泛型方法泛型的上界泛型的上下文界定

 

上一篇:Spark入门之idea编写Scala脚本


下一篇:ccf/csp认证 201903-1题小中大