第一章.模式匹配
1.匹配元组
package com.atguigu.chapter08import com.atguigu.chapter07.$07_Tuple.{Region, School, Student}object $07_MatchTuple { /** * 匹配元组的时候,变量是几元元组,匹配条件就只能是几元元组 */ def main(args: Array[String]): Unit = { val t1:(Any,Any,Any) = ("zhangsan",20,"shenzhen") t1 match{ case (x:String, y:Int, z:Int) =>println(s"1x=${x} y=${y} z=${z}") case (x,y,z)=>println(s"2x=${x} y=${y} z=${z}") } val list3 = List( new Region("宝安区1",new School("宝安中学1",new Student("张三1",21))), new Region("宝安区2",new School("宝安中学2",new Student("张三2",22))), new Region("宝安区3",new School("宝安中学3",new Student("张三3",23))), new Region("宝安区4",new School("宝安中学4",new Student("张三4",24))) ) val list4 = for (elem <- list3) yield { (elem.name, (elem.school.name, (elem.school.student.name, elem.school.student.age))) } list4.foreach(x=>{ x match{ case(regionName,(schoolName,(stuName,age)))=> println(stuName) } }) }}
2.匹配对象与样例类
package com.atguigu.chapter08object MatchClass { /** * 样例类,其实就是伴生类和伴生对象的封装 * 语法: case class 类名([val/var] 属性名:类型,.....) * 属性不用val/var修饰的默认就是val修饰的 * 创建对象: 类名(值,....) * 样例对象: case object object 名称 * * 普通类默认不能直接用于模式匹配,如果想用模式匹配需要在伴生对象中定义unapply方法,unapply方法就是将对象解构成属性 */ case class Person(val name:String,var age:Int,address:String) abstract class Sex //样例对象 case object Man extends Sex case object Woman extends Sex def xx(sex:Sex)={ println(sex) } def main(args: Array[String]): Unit = { val person = Person("lisi",20,"shenzhen") println(person.address) println(person.name) println(person.age) person.age=100 val student = Student("zhangsan",20,"beijing") println(student.name) println(student.address) println(student.age) xx(Man) person match { case Person(x,_,z)=> println(s"name=${x} address=${z}") } val stu:Student = new Student("lisi",20,"zz") stu match{ case Student(x,y,z)=> println(s"${x} ${y} ${z}") } } class Student(val name:String,var age:Int, val address:String) object Student{ def apply(name:String,age:Int,address:String)=new Student(name,age,address) def unapply(stu:Student):Option[(String,Int,String)]={ if(stu == null) None else Some((stu.name,stu.age,stu.address)) } }}
3.变量声明与for循环的模式匹配
package com.atguigu.chapter08object $09_MatchParam { def main(args: Array[String]): Unit = { val t =("zhangsan",20,"shenzhen") println(t._1) val (name,age,address)=("zhangsan",20,"shenzhen") println(name) val List(x,_*)=List(1,2,3,4,45,4) println(x) val Array(y,z)=Array("hello",1) println(y,z) val map = Map[String,Int]("aa"->1,"bb"->2) for ((k,v)<- map) { println(k) println(v) } }}
4.偏函数
package com.atguigu.chapter08import com.atguigu.chapter07.$07_Tuple.{Region, School, Student}import scala.io.StdInobject $10_PartitalFunction { /** * 偏函数: 没有match关键字的模式匹配称之为偏函数 * 语法: val 函数名:PartialFunction[IN,OUT]={ * case 条件=> ... * case 条件=> ... * case 条件=> ... * .... * } */ def main(args: Array[String]): Unit = { val func:PartialFunction[String,Int]={ case "hadoop"=>{ println("hadoop..") 10 } case "spark"=>{ println("spark..") 20 } case _ =>{ println("其他..") 30 } } val wc = StdIn.readLine("请输入一个单词:") println(func(wc)) val list = List("hello","spark","hadoop","flume") val func2:PartialFunction[String,Int]={ case x =>x.length } //list.map(x=>x.length) println(list.map{ case x => x.length }) val list3 = List( ("宝安区1",("宝安中学1",("张三1",21))), ("宝安区2",("宝安中学2",("张三2",22))), ("宝安区3",("宝安中学3",("张三3",23))), ("宝安区4",("宝安中学4",("张三4",24))) ) list3.foreach(x=>x match{ case(regionName,(schoolName,(stuName,age)))=> println(stuName) }) //偏函数的使用场景 val func3:PartialFunction[(String,(String,(String,Int))),Unit]={ case(regionName,(schoolName,(stuName,age)))=> println(stuName) } list3.foreach{ case(regionName,(schoolName,(stuName,age)))=> println(stuName) } }}
第二章.异常
package com.atguigu.chapter09import scala.util.Tryobject $01_Exception { /** * java的异常处理方式 * 1.捕获异常: try{...}catch(Exception e){...}.. finally{...} * 2.抛出异常: throw new XXException[必须在方法名后面通过throws声明异常] * * * scala的异常处理方式 * 1.捕获异常 * a.try{...}catch{case e:Exception => ...} finally{...}<一般用于获取外部资源链接的时候使用,可以通过finally关闭资源链接> * b.Try(代码块).getOrElse(默认值)<常用> * Try有两个子类: * Success: 代表代码执行成功,代码执行结果封装在Success中 * Failture: 代表代码执行失败 * Try(代码块).getOrElse(默认值) [此时如果代码执行成功,则返回执行结果,如果代码执行失败则返回默认值] * 2.抛出异常:throw new XXException [不需要在方法后面通过throws关键字声明异常]<不用> */ def main(args: Array[String]): Unit = { //println(m1(10, 2)) //println(m1(10, 0)) println(m2(10, 0)) val list= List("1 zhangsan 20 beijing","2 30 shenzhen","3 lisi tianjin") val list2 = list.map(x=>{ val arr = x.split(" ") val age = Try(arr(2).toInt).getOrElse(0) (arr.head,arr(1),age,arr(3)) }) println(list2) } //抛异常 def m1(x:Int,y:Int):Int={ if(y==0) throw new Exception("被除数不能为0") else x/y } //捕获异常 def m2(x:Int,y:Int):Int={ try{ x/y }catch{ case e:Exception => println(e.getMessage) -1 } }}
第三章.隐式转换
1.隐式转换方法
package com.atguigu.chapter10import java.io.Fileimport scala.io.{BufferedSource, Source}class BB{ //隐式转换方法 implicit def double2Int(d:Double):Int={ println(s"-------->${d}") d.toInt } //隐式转换方法 implicit def file2SourceBuffer(file:File):BufferedSource={ Source.fromFile(file,"utf-8") }}object $01_ImplicitMethod { /** * 隐式转换分为三类: * 1.隐式转换方法:悄悄的将一个类型转成另一个类型 * 语法: implicit def 方法名(参数名:待转换类型):目标类型={....} * 隐式转换方法的调用时机: * 1.当前类型与目标类型不一致的时候,会自动调用隐式转换方法 * 2.当对象使用了不属于自身的属性和方法的时候,会自动调用隐式转换方法 * 2.隐式参数 * 3.隐式类 * 隐式转换的解析 * 首先会从当前作用域和父作用域查找是否有符合条件的隐式转换,如果有直接使用,如果没有则报错 * 如果隐式转换定义在其他的object/class中,使用的时候需要导入 * 1.隐式转换定义在object中,此时可以通过import object名称._ \ import object名称.隐式转换名称 * 2.隐式转换定义在class中,此时可以通过 import 对象名._ /import 对象名.隐式转换名称 导入 * 如果有多个隐式转换都符合要求,需要明确指定需要使用哪一个隐式转换 */ def main(args: Array[String]): Unit = { val bb = new BB import bb._ import bb.double2Int val a:Int=2.5 val file = new File("C:\\Users\\admin\\IdeaProjects\\atguigu\\scala-study\\datas\\wc.txt") file.getLines().foreach(println(_)) }}
2.隐式参数
package com.atguigu.chapter10object $02_ImplicitParam { /** * 隐式参数:调用方法的时候自动传参 * 语法: * 1.在定义方法的时候,指定哪个参数后续会自动传值: * def 方法名(参数名:类型,..)(implicit 参数名:类型)={...} * 2.定义隐式参数的值: * implicit val 参数名:类型 = 值 */ def main(args: Array[String]): Unit = { import com.atguigu.chapter10.AA.z1 println(m1(10, 20)(50)) println(m2) } def m1(x:Int,y:Int)(implicit z:Int)=x+y+z def m2(implicit z:Int)=z}
3.隐式类
package com.atguigu.chapter10import java.io.Fileobject $03_ImplicitClass { /** * 隐式类: * 语法: implicit class 目标类名称(属性名:待转换类型){...} * 隐式类其实就是一种特殊形式的隐式转换方法 * 隐式类不能置于最顶层,必须放在object/class中 * 隐式类其实就是自动调用主构造器进行类型的转换 */ implicit class RichFile(file:File){ def m1(x:Int,y:Int)=x+y val name = "zhansan" } def main(args: Array[String]): Unit = { val file = new File("C:\\Users\\admin\\IdeaProjects\\atguigu\\scala-study\\datas\\wc.txt") println(file.m1(20, 30)) }/* implicit def file2RichFile( file:File ):RichFile = { new RichFile }*/}
第四章.泛型
1.泛型方法
package com.atguigu.chapter11object $01_GenericMethod { /** * 泛型方法: * 语法: def 方法名[T,U,...](参数名:T):U={...} */ def main(args: Array[String]): Unit = { m1[String](Array("aa","bb")) } def m1[T](x:Array[T])={ println(x.length) }}
2.泛型类
package com.atguigu.chapter11import java.beans.BeanPropertyobject $02_GenericClass { /** * 泛型类语法: * class 类名[T,U,...](属性名:T,...){ * def 方法名(x:T):U=.. * } * @param args */ class Person[T,U](@BeanProperty var name:T, @BeanProperty var age:U) def main(args: Array[String]): Unit = { val person = new Person[String,Int]("lisi",20) println(person.getName) }}
3.非变,逆变,协变
package com.atguigu.chapter11/** * 非变[T]:同一个类,如果泛型不一样创建出来的对象没有任何关系 * 协变[+T]:同一个类,如果泛型之间有父子关系,创建出来的对象继承了泛型的父子关系 * 逆变[-T]:同一个类,如果泛型之间有父子关系,创建出来的对象颠倒了泛型的父子关系 */object $03_GenericChange { class Animal class Dog extends Animal //非变 class Parent[T] //逆变 class Parent2[+T] //协变 class Parent3[-T] def main(args: Array[String]): Unit = { var list1 = List[Animal](new Animal,new Animal) println(list1) var list2 = List[Dog](new Dog,new Dog) list1 = list2 println(list1) //非变 var b1 = new Parent[Animal] var b2 = new Parent[Dog] //b1 = b2 //协变 var b3 = new Parent2[Animal] var b4 = new Parent2[Dog] b3 = b4 println(b3) //逆变 var b5 = new Parent3[Animal] var b6 = new Parent3[Dog] b6 = b5 println(b6) }}
4.上下限
package com.atguigu.chapter11object $04_GenericLowHight { class Parent class Sub1 extends Parent class Sub2 extends Sub1 class Sub3 extends Sub2 /** * 上限[T<:类型]:要求传入的类型必须是指定类型或者是其子类 * 下限[T>:类型]:要求传入的类型必须是指定类型或者是其父类 */ //上限 def m1[T<:Sub1](t:T)={ println(t) } //下限 def m2[T>:Sub1](t:T)={ println(t) } def main(args: Array[String]): Unit = { //上限 //m1(new Parent) m1(new Sub3) //下限 m2(new Parent) val p:Any = new Sub3 m2(p) val x:Any = 10 m2(x) }}
5.上下文
package com.atguigu.chapter11import java.beans.BeanPropertyobject $05_GenericContext { /** * 上下文: * 语法: T:类型 */ class Person[T]{ @BeanProperty var name:T=_ } def main(args: Array[String]): Unit = { implicit val p:Person[String] = new Person[String] val person = m1[Int](10)(new Person[Int]) val person2 = m1[String]("zhangsan") println(person.getName) println(person2.getName) val person3 = m2[String]("wangwu") println(person3.getName) } def m1[U](x:U)(implicit p:Person[U])={ p.setName(x) p } def m2[U:Person](x:U)={ val person =implicitly[Person[U]] person.setName(x) person }}