第一章.模式匹配

1.匹配元组

  1. package com.atguigu.chapter08
  2. import com.atguigu.chapter07.$07_Tuple.{Region, School, Student}
  3. object $07_MatchTuple {
  4. /**
  5. * 匹配元组的时候,变量是几元元组,匹配条件就只能是几元元组
  6. */
  7. def main(args: Array[String]): Unit = {
  8. val t1:(Any,Any,Any) = ("zhangsan",20,"shenzhen")
  9. t1 match{
  10. case (x:String, y:Int, z:Int) =>println(s"1x=${x} y=${y} z=${z}")
  11. case (x,y,z)=>println(s"2x=${x} y=${y} z=${z}")
  12. }
  13. val list3 = List(
  14. new Region("宝安区1",new School("宝安中学1",new Student("张三1",21))),
  15. new Region("宝安区2",new School("宝安中学2",new Student("张三2",22))),
  16. new Region("宝安区3",new School("宝安中学3",new Student("张三3",23))),
  17. new Region("宝安区4",new School("宝安中学4",new Student("张三4",24)))
  18. )
  19. val list4 = for (elem <- list3) yield {
  20. (elem.name, (elem.school.name, (elem.school.student.name, elem.school.student.age)))
  21. }
  22. list4.foreach(x=>{
  23. x match{
  24. case(regionName,(schoolName,(stuName,age)))=> println(stuName)
  25. }
  26. })
  27. }
  28. }

2.匹配对象与样例类

  1. package com.atguigu.chapter08
  2. object MatchClass {
  3. /**
  4. * 样例类,其实就是伴生类和伴生对象的封装
  5. * 语法: case class 类名([val/var] 属性名:类型,.....)
  6. * 属性不用val/var修饰的默认就是val修饰的
  7. * 创建对象: 类名(值,....)
  8. * 样例对象: case object object 名称
  9. *
  10. * 普通类默认不能直接用于模式匹配,如果想用模式匹配需要在伴生对象中定义unapply方法,unapply方法就是将对象解构成属性
  11. */
  12. case class Person(val name:String,var age:Int,address:String)
  13. abstract class Sex
  14. //样例对象
  15. case object Man extends Sex
  16. case object Woman extends Sex
  17. def xx(sex:Sex)={
  18. println(sex)
  19. }
  20. def main(args: Array[String]): Unit = {
  21. val person = Person("lisi",20,"shenzhen")
  22. println(person.address)
  23. println(person.name)
  24. println(person.age)
  25. person.age=100
  26. val student = Student("zhangsan",20,"beijing")
  27. println(student.name)
  28. println(student.address)
  29. println(student.age)
  30. xx(Man)
  31. person match {
  32. case Person(x,_,z)=> println(s"name=${x} address=${z}")
  33. }
  34. val stu:Student = new Student("lisi",20,"zz")
  35. stu match{
  36. case Student(x,y,z)=> println(s"${x} ${y} ${z}")
  37. }
  38. }
  39. class Student(val name:String,var age:Int, val address:String)
  40. object Student{
  41. def apply(name:String,age:Int,address:String)=new Student(name,age,address)
  42. def unapply(stu:Student):Option[(String,Int,String)]={
  43. if(stu == null) None
  44. else Some((stu.name,stu.age,stu.address))
  45. }
  46. }
  47. }

3.变量声明与for循环的模式匹配

  1. package com.atguigu.chapter08
  2. object $09_MatchParam {
  3. def main(args: Array[String]): Unit = {
  4. val t =("zhangsan",20,"shenzhen")
  5. println(t._1)
  6. val (name,age,address)=("zhangsan",20,"shenzhen")
  7. println(name)
  8. val List(x,_*)=List(1,2,3,4,45,4)
  9. println(x)
  10. val Array(y,z)=Array("hello",1)
  11. println(y,z)
  12. val map = Map[String,Int]("aa"->1,"bb"->2)
  13. for ((k,v)<- map) {
  14. println(k)
  15. println(v)
  16. }
  17. }
  18. }

4.偏函数

  1. package com.atguigu.chapter08
  2. import com.atguigu.chapter07.$07_Tuple.{Region, School, Student}
  3. import scala.io.StdIn
  4. object $10_PartitalFunction {
  5. /**
  6. * 偏函数: 没有match关键字的模式匹配称之为偏函数
  7. * 语法: val 函数名:PartialFunction[IN,OUT]={
  8. * case 条件=> ...
  9. * case 条件=> ...
  10. * case 条件=> ...
  11. * ....
  12. * }
  13. */
  14. def main(args: Array[String]): Unit = {
  15. val func:PartialFunction[String,Int]={
  16. case "hadoop"=>{
  17. println("hadoop..")
  18. 10
  19. }
  20. case "spark"=>{
  21. println("spark..")
  22. 20
  23. }
  24. case _ =>{
  25. println("其他..")
  26. 30
  27. }
  28. }
  29. val wc = StdIn.readLine("请输入一个单词:")
  30. println(func(wc))
  31. val list = List("hello","spark","hadoop","flume")
  32. val func2:PartialFunction[String,Int]={
  33. case x =>x.length
  34. }
  35. //list.map(x=>x.length)
  36. println(list.map{
  37. case x => x.length
  38. })
  39. val list3 = List(
  40. ("宝安区1",("宝安中学1",("张三1",21))),
  41. ("宝安区2",("宝安中学2",("张三2",22))),
  42. ("宝安区3",("宝安中学3",("张三3",23))),
  43. ("宝安区4",("宝安中学4",("张三4",24)))
  44. )
  45. list3.foreach(x=>x match{
  46. case(regionName,(schoolName,(stuName,age)))=> println(stuName)
  47. })
  48. //偏函数的使用场景
  49. val func3:PartialFunction[(String,(String,(String,Int))),Unit]={
  50. case(regionName,(schoolName,(stuName,age)))=> println(stuName)
  51. }
  52. list3.foreach{
  53. case(regionName,(schoolName,(stuName,age)))=> println(stuName)
  54. }
  55. }
  56. }

第二章.异常

  1. package com.atguigu.chapter09
  2. import scala.util.Try
  3. object $01_Exception {
  4. /**
  5. * java的异常处理方式
  6. * 1.捕获异常: try{...}catch(Exception e){...}.. finally{...}
  7. * 2.抛出异常: throw new XXException[必须在方法名后面通过throws声明异常]
  8. *
  9. *
  10. * scala的异常处理方式
  11. * 1.捕获异常
  12. * a.try{...}catch{case e:Exception => ...} finally{...}<一般用于获取外部资源链接的时候使用,可以通过finally关闭资源链接>
  13. * b.Try(代码块).getOrElse(默认值)<常用>
  14. * Try有两个子类:
  15. * Success: 代表代码执行成功,代码执行结果封装在Success中
  16. * Failture: 代表代码执行失败
  17. * Try(代码块).getOrElse(默认值) [此时如果代码执行成功,则返回执行结果,如果代码执行失败则返回默认值]
  18. * 2.抛出异常:throw new XXException [不需要在方法后面通过throws关键字声明异常]<不用>
  19. */
  20. def main(args: Array[String]): Unit = {
  21. //println(m1(10, 2))
  22. //println(m1(10, 0))
  23. println(m2(10, 0))
  24. val list= List("1 zhangsan 20 beijing","2 30 shenzhen","3 lisi tianjin")
  25. val list2 = list.map(x=>{
  26. val arr = x.split(" ")
  27. val age = Try(arr(2).toInt).getOrElse(0)
  28. (arr.head,arr(1),age,arr(3))
  29. })
  30. println(list2)
  31. }
  32. //抛异常
  33. def m1(x:Int,y:Int):Int={
  34. if(y==0) throw new Exception("被除数不能为0")
  35. else x/y
  36. }
  37. //捕获异常
  38. def m2(x:Int,y:Int):Int={
  39. try{
  40. x/y
  41. }catch{
  42. case e:Exception =>
  43. println(e.getMessage)
  44. -1
  45. }
  46. }
  47. }

第三章.隐式转换

1.隐式转换方法

  1. package com.atguigu.chapter10
  2. import java.io.File
  3. import scala.io.{BufferedSource, Source}
  4. class BB{
  5. //隐式转换方法
  6. implicit def double2Int(d:Double):Int={
  7. println(s"-------->${d}")
  8. d.toInt
  9. }
  10. //隐式转换方法
  11. implicit def file2SourceBuffer(file:File):BufferedSource={
  12. Source.fromFile(file,"utf-8")
  13. }
  14. }
  15. object $01_ImplicitMethod {
  16. /**
  17. * 隐式转换分为三类:
  18. * 1.隐式转换方法:悄悄的将一个类型转成另一个类型
  19. * 语法: implicit def 方法名(参数名:待转换类型):目标类型={....}
  20. * 隐式转换方法的调用时机:
  21. * 1.当前类型与目标类型不一致的时候,会自动调用隐式转换方法
  22. * 2.当对象使用了不属于自身的属性和方法的时候,会自动调用隐式转换方法
  23. * 2.隐式参数
  24. * 3.隐式类
  25. * 隐式转换的解析
  26. * 首先会从当前作用域和父作用域查找是否有符合条件的隐式转换,如果有直接使用,如果没有则报错
  27. * 如果隐式转换定义在其他的object/class中,使用的时候需要导入
  28. * 1.隐式转换定义在object中,此时可以通过import object名称._ \ import object名称.隐式转换名称
  29. * 2.隐式转换定义在class中,此时可以通过 import 对象名._ /import 对象名.隐式转换名称 导入
  30. * 如果有多个隐式转换都符合要求,需要明确指定需要使用哪一个隐式转换
  31. */
  32. def main(args: Array[String]): Unit = {
  33. val bb = new BB
  34. import bb._
  35. import bb.double2Int
  36. val a:Int=2.5
  37. val file = new File("C:\\Users\\admin\\IdeaProjects\\atguigu\\scala-study\\datas\\wc.txt")
  38. file.getLines().foreach(println(_))
  39. }
  40. }

2.隐式参数

  1. package com.atguigu.chapter10
  2. object $02_ImplicitParam {
  3. /**
  4. * 隐式参数:调用方法的时候自动传参
  5. * 语法:
  6. * 1.在定义方法的时候,指定哪个参数后续会自动传值:
  7. * def 方法名(参数名:类型,..)(implicit 参数名:类型)={...}
  8. * 2.定义隐式参数的值:
  9. * implicit val 参数名:类型 = 值
  10. */
  11. def main(args: Array[String]): Unit = {
  12. import com.atguigu.chapter10.AA.z1
  13. println(m1(10, 20)(50))
  14. println(m2)
  15. }
  16. def m1(x:Int,y:Int)(implicit z:Int)=x+y+z
  17. def m2(implicit z:Int)=z
  18. }

3.隐式类

  1. package com.atguigu.chapter10
  2. import java.io.File
  3. object $03_ImplicitClass {
  4. /**
  5. * 隐式类:
  6. * 语法: implicit class 目标类名称(属性名:待转换类型){...}
  7. * 隐式类其实就是一种特殊形式的隐式转换方法
  8. * 隐式类不能置于最顶层,必须放在object/class中
  9. * 隐式类其实就是自动调用主构造器进行类型的转换
  10. */
  11. implicit class RichFile(file:File){
  12. def m1(x:Int,y:Int)=x+y
  13. val name = "zhansan"
  14. }
  15. def main(args: Array[String]): Unit = {
  16. val file = new File("C:\\Users\\admin\\IdeaProjects\\atguigu\\scala-study\\datas\\wc.txt")
  17. println(file.m1(20, 30))
  18. }
  19. /* implicit def file2RichFile( file:File ):RichFile = {
  20. new RichFile
  21. }*/
  22. }

第四章.泛型

1.泛型方法

  1. package com.atguigu.chapter11
  2. object $01_GenericMethod {
  3. /**
  4. * 泛型方法:
  5. * 语法: def 方法名[T,U,...](参数名:T):U={...}
  6. */
  7. def main(args: Array[String]): Unit = {
  8. m1[String](Array("aa","bb"))
  9. }
  10. def m1[T](x:Array[T])={
  11. println(x.length)
  12. }
  13. }

2.泛型类

  1. package com.atguigu.chapter11
  2. import java.beans.BeanProperty
  3. object $02_GenericClass {
  4. /**
  5. * 泛型类语法:
  6. * class 类名[T,U,...](属性名:T,...){
  7. * def 方法名(x:T):U=..
  8. * }
  9. * @param args
  10. */
  11. class Person[T,U](@BeanProperty var name:T, @BeanProperty var age:U)
  12. def main(args: Array[String]): Unit = {
  13. val person = new Person[String,Int]("lisi",20)
  14. println(person.getName)
  15. }
  16. }

3.非变,逆变,协变

  1. package com.atguigu.chapter11
  2. /**
  3. * 非变[T]:同一个类,如果泛型不一样创建出来的对象没有任何关系
  4. * 协变[+T]:同一个类,如果泛型之间有父子关系,创建出来的对象继承了泛型的父子关系
  5. * 逆变[-T]:同一个类,如果泛型之间有父子关系,创建出来的对象颠倒了泛型的父子关系
  6. */
  7. object $03_GenericChange {
  8. class Animal
  9. class Dog extends Animal
  10. //非变
  11. class Parent[T]
  12. //逆变
  13. class Parent2[+T]
  14. //协变
  15. class Parent3[-T]
  16. def main(args: Array[String]): Unit = {
  17. var list1 = List[Animal](new Animal,new Animal)
  18. println(list1)
  19. var list2 = List[Dog](new Dog,new Dog)
  20. list1 = list2
  21. println(list1)
  22. //非变
  23. var b1 = new Parent[Animal]
  24. var b2 = new Parent[Dog]
  25. //b1 = b2
  26. //协变
  27. var b3 = new Parent2[Animal]
  28. var b4 = new Parent2[Dog]
  29. b3 = b4
  30. println(b3)
  31. //逆变
  32. var b5 = new Parent3[Animal]
  33. var b6 = new Parent3[Dog]
  34. b6 = b5
  35. println(b6)
  36. }
  37. }

4.上下限

  1. package com.atguigu.chapter11
  2. object $04_GenericLowHight {
  3. class Parent
  4. class Sub1 extends Parent
  5. class Sub2 extends Sub1
  6. class Sub3 extends Sub2
  7. /**
  8. * 上限[T<:类型]:要求传入的类型必须是指定类型或者是其子类
  9. * 下限[T>:类型]:要求传入的类型必须是指定类型或者是其父类
  10. */
  11. //上限
  12. def m1[T<:Sub1](t:T)={
  13. println(t)
  14. }
  15. //下限
  16. def m2[T>:Sub1](t:T)={
  17. println(t)
  18. }
  19. def main(args: Array[String]): Unit = {
  20. //上限
  21. //m1(new Parent)
  22. m1(new Sub3)
  23. //下限
  24. m2(new Parent)
  25. val p:Any = new Sub3
  26. m2(p)
  27. val x:Any = 10
  28. m2(x)
  29. }
  30. }

5.上下文

  1. package com.atguigu.chapter11
  2. import java.beans.BeanProperty
  3. object $05_GenericContext {
  4. /**
  5. * 上下文:
  6. * 语法: T:类型
  7. */
  8. class Person[T]{
  9. @BeanProperty var name:T=_
  10. }
  11. def main(args: Array[String]): Unit = {
  12. implicit val p:Person[String] = new Person[String]
  13. val person = m1[Int](10)(new Person[Int])
  14. val person2 = m1[String]("zhangsan")
  15. println(person.getName)
  16. println(person2.getName)
  17. val person3 = m2[String]("wangwu")
  18. println(person3.getName)
  19. }
  20. def m1[U](x:U)(implicit p:Person[U])={
  21. p.setName(x)
  22. p
  23. }
  24. def m2[U:Person](x:U)={
  25. val person =implicitly[Person[U]]
  26. person.setName(x)
  27. person
  28. }
  29. }