• Scala_match、case、implicitt(四)


    trait

    object Test05_trait {
      def main(args: Array[String]): Unit = {
        val person = new Person("AA");
        person.hello()
        person.happy()
        person.ku()
        person.HaiMan()
      }
    
    }
    class Person(name:String) extends God with Mg {
      def hello(): Unit={
        println(s"$name say hello")
      }
    
      // 子类来实现
      override def HaiMan(): Unit = {
        println("子类实现害人方法")
      }
    }
    
    trait God{
      def happy():Unit={
        println("god . ..... say")
      }
    }
    
    trait Mg{
      def ku():Unit={
        println("Mg . ..... say")
      }
      // 不写实现,类似java接口或抽象类方法
      def HaiMan():Unit
    }
    
    /**
     * AA say hello
     * god . ..... say
     * Mg . ..... say
     * 子类实现害人方法
     */

    case

    当正常操作
    object Test06_case_class {
      def main(args: Array[String]): Unit = {
        val hsq1 = new Dog("hsq", 5)
        val hsq2 = new Dog("hsq", 5)
        println(hsq1) // com.xiaoke.scala.Dog@357246de
        println(hsq2) // com.xiaoke.scala.Dog@28f67ac7
        println(hsq1.equals(hsq2)) false // 因为equals底层: (this == obj);
        println(hsq1 == (hsq2))    false
        // java中 基本数据类型==比较的是值,复合数据类型,比较的是内存地址
      }
    
    }
    
    class Dog(name:String, age:Int){
    }
    
    当加入case
    object Test06_case_class {
      def main(args: Array[String]): Unit = {
        val hsq1 = new Dog("hsq", 5)
        val hsq2 = new Dog("hsq", 5)
        println(hsq1) // Dog(hsq,5)
        println(hsq2) // Dog(hsq,5)
        println(hsq1.equals(hsq2)) true // 因为equals底层: (this == obj);
        println(hsq1 == (hsq2))    true
        // java中 基本数据类型==比较的是值,复合数据类型,比较的是内存地址
      }
    }
    case  class Dog(name:String, age:Int){
    }

    match

        // match 相当于java中的switch
    
        val tuple = (1.0, 88, "abc", false, 'a')
    
        val iterator = tuple.productIterator
        val units = iterator.map(
          (x) => {
            x match {
              case 1 => println(s"..$x.... is int")
              case 88 => println(s"$x .... is 88")
              case false => println(s"$x...is false")
              case w: Int if w > 50 => println(s"$w...is > 50")
              case _ => println("default")
            }
          }
    
        )
    
        while (iterator.hasNext){
          val unit = iterator.next()
          println(unit)
        }

    partialFunction

      def ooxx: PartialFunction[ Any,String] = {
        case "hello" => "val is hello"
        case x:Int => s"$x...is int"
        case _ => "none"
      }
    
    
      def main(args: Array[String]): Unit = {
        ooxx("hello")
      }

    implicit

      
      // 自定义一个foreach方法
      def main(args: Array[String]): Unit = {
        var list = new util.LinkedList[Int]()
        list.add(1)
        list.add(2)
        list.add(3)
        //list没有foreach
        def foreach[T](list:util.LinkedList[T], fun:(T)=> Unit): Unit ={
          val iter = list.iterator()
          while (iter.hasNext) {
            fun(iter.next())
          }
        }
        foreach(list, println)
      }
      
      
      
      
      优化:将参数提取到类上
            def main(args: Array[String]): Unit = {
            var list = new util.LinkedList[Int]()
            list.add(1)
            list.add(2)
            list.add(3)
            //list没有foreach
            val myself = new Myself(list)
            myself.foreach(println)
          }
        }
    
    class Myself[T](list: util.LinkedList[T]){
          def foreach( fun:(T)=> Unit): Unit ={
            val iter = list.iterator()
            while (iter.hasNext) fun(iter.next())
          }
          
          
          
          // 使用隐式转换(隐式方法)
      def main(args: Array[String]): Unit = {
        var list = new util.LinkedList[Int]()
        list.add(1)
        list.add(2)
        list.add(3)
        //list没有foreach
        implicit def myselfMessage[T](list: util.LinkedList[T])={
          new Myself(list)
        }
        list.foreach(println)
       // myselfMessage(list).foreach(println)
      }
    }
    class Myself[T](list: util.LinkedList[T]){
      def foreach( fun:(T)=> Unit): Unit ={
        val iter = list.iterator()
        while (iter.hasNext) fun(iter.next())
      }
    }
    
    
    // 使用隐式转换(隐式类)
      def main(args: Array[String]): Unit = {
        var list = new util.LinkedList[Int]()
        list.add(1)
        list.add(2)
        list.add(3)
        //list没有foreach
        implicit class myself[T](list: util.LinkedList[T]){
          def foreach( fun:(T)=> Unit): Unit ={
            val iter = list.iterator()
            while (iter.hasNext) fun(iter.next())
          }
        }
        list.foreach(println)
        myself(list).foreach(println)
      }
    }
    
    
    
    
    // LinkedList更换成ArrayList 又不行了,所以更换List的父类Iterator
      def main(args: Array[String]): Unit = {
        var arrayListInfo = new util.ArrayList[Int]()
        arrayListInfo.add(1)
        arrayListInfo.add(2)
        arrayListInfo.add(3)
        var linkedListInfo = new util.LinkedList[Int]()
        linkedListInfo.add(1)
        linkedListInfo.add(2)
        linkedListInfo.add(3)
        //自定义LinkedList隐士转换
        implicit def linkedList[T](list:util.LinkedList[T])={
          val iter = list.iterator()
          new Myself(iter)
        }
        //自定义LinkedList隐士转换
        implicit def arrayList[T](list:util.ArrayList[T])={
          val iter = list.iterator()
          new Myself(iter)
        }
        arrayListInfo.foreach(println)
        linkedListInfo.foreach(println)
      }
    }
    class Myself[T](iter: util.Iterator[T]){
      def foreach( fun:(T)=> Unit): Unit ={
        while (iter.hasNext) fun(iter.next())
      }
    }
    
    
    
    
    
    //隐式参数
        implicit  val sss:String = "lisi"
        implicit  val aaa:Int = 18
        def ooxx(implicit name:String, age: Int): Unit ={
          println(s"name =$name,  age=$age")
        }
        ooxx
        ooxx("xiaoke", 18)
        结果:1.当不传递值,使用的是implicit的默认值 2.传递值,要么不传递,要么全部传递
        name =lisi,  age=18
        name =xiaoke,  age=18
        
        问题:如果上面的需要只传递一个值怎么办? 柯里化
        implicit  val aaa:String = "老王"
        def ooxx(age: Int)(implicit name:String): Unit ={
          println(s"name =$name,  age=$age")
        }
        ooxx(18)
        ooxx( 18)("小柯")
        结果: 
        name =老王,  age=18
        name =小柯,  age=18

    scala写worldcount

    idea中scala普通项目转maven项目
    -> 右键 Add Framework Support
    
    
    object WordCountScala {
      def main(args: Array[String]): Unit = {
        val conf = new SparkConf()
        conf.setAppName("wordcount")
        // 本地单机运行
        conf.setMaster("local")
        val sc = new SparkContext(conf)
        val fileRdd = sc.textFile("D:\code\scala\test\one\data\testdata.txt")
        // hello world
        val words = fileRdd.flatMap((x:String)=>{x.split(" ")})
        // hello
        // world
        val tuple2 = words.map((x:String)=>{new Tuple2(x, 1)})
        // (hello, 1)
        // (world, 1)
        val res = tuple2.reduceByKey((x:Int, y:Int) => {x + y})
        /**
         * (spark,2)
         * (hello,3)
         * (msb,1)
         * (good,1)
         * (world,1)
         */
        val fanzhuan: RDD[(Int, Int)] = res.map((x)=>{  (x._2,1)  })
        /**
         * (2,1)
         * (3,1)
         * (1,1)
         * (1,1)
         * (1,1)
         */
        fanzhuan.foreach(println)
        val resOver: RDD[(Int, Int)] = fanzhuan.reduceByKey(_+_)
        /**
         * (1,3)
         * (3,1)
         * (2,1)
         */
        resOver.foreach(println)
        res.foreach(println)
        Thread.sleep(Long.MaxValue)
      }
    }
    
    pom:
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.11</artifactId>
                <version>2.3.4</version>
            </dependency>
  • 相关阅读:
    计算机注销、热启动、冷启动
    从高处理解android与服务器交互(看懂了做开发就会非常的容易)
    Android—Work—1day
    软件需求分析方法
    Android 常用控件的介绍
    android中Json的一些应用
    java数据传递例子+内存分析
    android中MVP模式
    android的四层体系结构,基于mvc三层结构浅析
    java
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14354705.html
Copyright © 2020-2023  润新知