zoukankan      html  css  js  c++  java
  • scala基础-04

    1. 复习老师讲课的内容,复制讲课的代码到工作空间,无法运行。注意:需要修改包名
      匹配match case,样例类case
      object ScalaDemo06 {
        def main(args: Array[String]): Unit = {
      //    val list = List(1,2,3,4,5,6)
          val num = 10
          matchVal(num)
          
          val list = List(1,2,3,45,9)
          list.foreach { matchVal }
          
          val ppp1 = new PPP("Angelababy",29)
          val ppp2 = PPP("Dilireba",26)
          val ppp3 = PPP("zhangxinyi",22)
          val ppp4 = PPP("fanbingbing",20)
          val ppp5 = PPP("liuyan",28)
          val pppList = List(ppp1,ppp2,ppp3,ppp4,ppp5)
          
          pppList.foreach { x => x match {
            case PPP("zhangxinyi",22) => println("value match" + x.toString())
            case p:PPP => println("type match" + p.toString()) 
            case _ => println(x.toString())
          }}
          
        }
        
        /**
         * 在scala中 match 既可以进行值匹配  又可以类型匹配
         * 在scala中 match根据顺序从上往下去匹配,一旦匹配成功就不再继续往下匹配了
         */
        def matchVal(num:Any) = {
          num match {
            case 10 => println(10) 
            case 9 => println(9)
            case i:Int => println("Int:" + i)
            case _ => println("default")
          }
        }
      }
      
      /**
       * 样例类(case classes)
       * 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类
       * 特点:
       *         1、样例类默认帮你实现了toString,equals,copy和hashCode、apply等方法
       *         2、样例类可以new, 也可以不用new
       */
      case class PPP(name:String,age:Int) {
        
      }
    2. set集合,trait,元组
      object ScalaDemo05 {
        def main(args: Array[String]): Unit = {
          //set集合    去重数据
          val set1 = Set(1, 2, 3, 4, 4)
          val set2 = Set(1, 2, 5)
          //遍历 注意:set会自动去重
          set1.foreach { println }
          for (s <- set1) {
            println(s)
          }
          //交集    .& = intersect
          val set3 = set1.intersect(set2)
          set3.foreach { println }
          val set4 = set1.&(set2)
          set4.foreach { println }
          println("*******")
          //差集  diff = &~
          set1.diff(set2).foreach { println }
          set1.&~(set2).foreach { println }
          //子集
          println(set1.subsetOf(set2))
      
          //最大值
          println(set1.max)
          //最小值
          println(set1.min)
          println("****")
          //1  2  3  4
          println(set1.mkString("	"))
      
          //(2,"shsxt")这是一个二元组类型    用一堆小括号组织起来的元素,
          //Option类型有两个子类型   Some None   如果通过key能够获取到value此时返回的是Some  否则返回的是None
          //getOrElse如果能获取到值,那么将值返回,否则返回的是默认值  get  getOrElse
          val map = Map(1 -> "bjsfanbingbingxt", (2, "shsxt"), "5" -> "sasxt")
          println(map.get("5").getOrElse("no result"))
          map.foreach((x: (Any, String)) => {
            println(x._2)
          })
      
          val map1 = Map(
            (1, "a"),
            (2, "b"),
            (3, "c"))
          val map2 = Map(
            (1, "aa"),
            (2, "bb"),
            (2, 90),
            (4, 22),
            (4, "dd"))
          map1.++:(map2).foreach(println)
      
          println(map.contains(6))
      
          println(map.exists(x => x._2.contains("fanbingbing")))
      
          /**
           * 元组
           * 1.元组定义
           * 与列表不同的是元组可以包含不同类型的元素。元祖对象是通过一对小括号包裹起来组成的
           */
          val t2 = Tuple2(1, "libingbing")
          val tt2 = (1, "lichen")
          val t3 = t2.swap
          println(t3._1 + "===" + t3._2)
      
          /**
           * trait    特性
           * 1.概念理解
           * Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
           * 与接口不同的是,它还可以定义属性和方法的实现。
           * 一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。
           * 2.举例:trait中带属性带方法实现
           * 注意:
           * 继承的多个trait中如果有同名的方法和属性,必须要在类中使用“override”重新定义。
           * trait中不可以传参数
           */
      
          val p = new Person1
          p.read("Fenger")
          p.listen("Fenger Love you")
      
          val p1 = new Point(2, 2)
          val p2 = new Point(1, 3)
          println(p1.isEqule(p2))
          println(p1.isNotEqule(p2))
        }
      }
      
      trait Read {
        val readType = "Read"
        val gender = "m"
        def read(name: String) {
          println(name + " is reading")
        }
      }
      
      trait Listen {
        val listenType = "Listen"
        val gender = "m"
        def listen(name: String) {
          println(name + " is listenning")
        }
      }
      
      class Person1() extends Read with Listen  {
        override val gender = "f"
      }
      
      trait Equle {
        def isEqule(x: Any): Boolean
        def isNotEqule(x: Any) = {
          !isEqule(x)
        }
      }
      
      class Point(x: Int, y: Int) extends Equle {
        val xx = x
        val yy = y
      
        def isEqule(p: Any) = {
          p.isInstanceOf[Point] && p.asInstanceOf[Point].xx == xx
        }
      
      }
    3. 隐式转换系统,隐式值,隐式视图,隐式类(减少代码量)
      /**
       * Scala的隐式转换系统
       *     隐式转换,在编写程序的时候可以尽量少的去编写代码,
       *     让编译器去尝试在编译期间自动推导出这些信息来,
       *     这种特性可以极大的减少代码量,提高代码质量
       * 包含:
       *     隐式值
       *     隐式视图(隐式方法)
       *     隐式类
       */
      object ScalaDemo07 {
        def main(args: Array[String]): Unit = {
      
          /**
           * 隐式值
           * 隐式转换必须满足无歧义规则
           *
           * 声明隐式参数的类型最好是自定义的数据类型,不要使用Int,String这些常用类型,防止碰巧冲突
           */
          implicit val num1 = 1000
          //    implicit val num2 = 2000
          add
      
          /**
           * type mismatch; found : String("1000") required: Int
           * 工作原理:
           *         在调用sayNum的时候传入的是字符串  与sayNum定义的参数不一致
           *         此时他会在作用域内寻找隐式视图,发现了stringToInt(参数是string,输出是Int)
           *         stringToInt("1000") = 1000
           *         sayNum(1000)
           */
          implicit def stringToInt(numStr: String) = Integer.parseInt(numStr)
          sayNum("1000")
      
          val s1 = new Student1()
          val s2 = new Student2()
          implicit def s2Tos1(s: Student2) = new Student1()
          s2.sayStudent("Anagelababy")
      
          /**
           * 隐式类
           * 工作原理:
           *         "abc"这个字符串在调用getLength方法的时候,发现没有这个方法,此时会在作用域内寻找隐式视图或者隐式类
           *         StringUtil隐式类,构造函数是String类型并且就一个参数,此时会将会创建StringUtil这个类的对象,将"abc"
           *         传入给StringUtil构造函数====StringUtil类型的对象,getLength方法
           */
          implicit class StringUtil(str: String) {
            def getLength() = str.length()
          }
          println("abc".getLength)
        }
      
        def add(implicit num: Int) = {
          println(num + 1000)
        }
      
        /**
         * 隐式视图
         *     隐式转换为目标类型:把一种类型自动转换到另一种类型
         */
        def sayNum(num: Int) = {
          println("say num:" + num)
        }
      }
      
      class Student1 {
        def sayStudent(name: String) = {
          println(name)
        }
      }
      class Student2 {
      
      }
  • 相关阅读:
    pandas_处理异常值缺失值重复值数据差分
    【C语言】输入10个人的成绩,求平均值
    【Markdown】新手快速入门基础教程
    【Python】 平方根
    【Python】 数字求和
    【Python】文件下载小助手
    【Python爬虫程序】抓取MM131美女图片,并将这些图片下载到本地指定文件夹。
    【Python】爬虫原理
    C语言最重要的知识点(电子文档)
    【Python】一些函数
  • 原文地址:https://www.cnblogs.com/yangjiming/p/9619310.html
Copyright © 2011-2022 走看看