• 3scala高级


    1、模式匹配

    //①简单表示:
        sign = ch match { 
            case '+' => 1 
            case '-'  => -1 
            case '_' => 0 
        }
    
    //②守卫:(case中加条件)
        grade match {
                case "A" => println(name + ", you are excellent")
                case "B" => println(name + ", you are good")
                case _ if name == "leo" => println(name + ", you are a good boy, come on")        //只有名字是leo,不管成绩是多少,打印
                case _ => println("you need to work harder")
          }
    
    //③匹配类型:
        e match {
                case e1: IllegalArgumentException => println("you have illegal arguments! exception is: " + e1)
                case e2: FileNotFoundException => println("cannot find the file you need read or write!, exception is: " + e2)
                case e3: IOException => println("you got an error while you were doing IO operation! exception is: " + e3)
                case _: Exception => println("cannot know which exception you have!" )
          }
        注:对异常的类型进行匹配(也可以对int,string等类型进行匹配)
    
    //④匹配集合:
    
          arr match {
                case Array("Leo") => println("Hi, Leo!")
                case Array(girl1, girl2, girl3) => println("Hi, girls, nice to meet you. " + girl1 + " and " + girl2 + " and " + girl3)
                case Array("Leo", _*) => println("Hi, Leo, please introduce your friends to me.")
                case _ => println("hey, who are you?")
          }
        注:匹配数组是集个参数,并且对值进行了匹配(集合也可以匹配)
    
    //⑤样例类:
    
        case  class Student(id:Int,name:String)            //类似于类一样,只不过封装了get,set,hashcode等方法,很重要
            val  student1 = Student(1,"lihaozong")
    
    
    //⑥Option:
    
        用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值。

    2、特质(trait)

        trait类似于java中的接口,不同的是trait中可以定义变量、定义函数及其实现
        trait ConsoleLogger{
            def log(msg:String){println(msg)}
        }

    3、隐式转换

        分为隐式转换和参数:可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来

        关键字: implicit

      1、隐式参数

        当调用函数的时候,发现参数个数不会,编译器回去隐式参数里去找,看看有没有同一类型的隐式参数,如果有,则用此
    
    
        object Test{
      
    
            def k1(x:Int,y:Int):Int=x+y
      
            def k2(x:Int)(implicit y:Int=5):Int=x+y
      
    
            def main(args: Array[String]): Unit = {
        
    
                println(k1(2,3))
                    //5
                println(k2(5))
                  //10
            }
        
    }
    
        注:编译器在调用k2的时候发现只穿了一个参数,这时就会在上下文中寻找有没有隐式参数,如果有,就调用隐式参数。
    
        object Test7 {
      
            implicit var b:Int=10
      
            def k2(x:Int, y:Int=5):Int=x+y
      
            def main(args: Array[String]): Unit = {
       
                 println(k2(5))
                  //0
            }
        
    }
        注:可以发现隐式参数是分类型的
    
        object Test7 {
      
            implicit var b:Int=10
      
            implicit var c:Int=15
      
            def k2(x:Int)(implicit y:Int=5):Int=x+y
      
            def main(args: Array[String]): Unit = {
        
                println(k2(5))
      
            }
        
    }
    
        注:这会报错,同一类型的隐式参数只有一个

            2、隐式转化: 

        当一个对象想要调用一个方法,但是这个对象又没有该方法,这时会触发隐式转换。
        编译器回去隐式方法里去找,看有没有这样一个隐式函数,把我这个对象转换为有这个方法的对象。
        如果我变成了这个对象后,不就有这个方法了吗?

        class Man(val name:String){}
        class SuperMan(val name:String){
              def fly():Unit={
                    println("超人会飞")
              }
        }
    
        object Test7 {
            implicit def man2SuperMan(man: Man):SuperMan=new SuperMan("")
            def main(args: Array[String]): Unit = {
                val man=new Man("abc")
                man.fly()
              }
        }
    
        注:开始定义了Man、SuperMan两个类,但是Man没有fly(),当使用这个方法,编译器会去寻找是否一个隐式转化使得Man-->SuperMan,
           如果找到(参数为Man类型,返回值为SuperMan),就进行转化,再调用方法
  • 相关阅读:
    开课博客
    高级UI组件(二)
    《梦断代码》读后感(三)
    高级UI组件
    今日总结
    今日总结
    android中关于时间的控件
    单选按钮和复选框
    Android开发中按钮的语法
    布局管理器的嵌套
  • 原文地址:https://www.cnblogs.com/lihaozong2013/p/10581231.html
Copyright © 2020-2023  润新知