• Scala中的构造器和高阶函数


    构造器

    在定义类时可以定义主构造器。主构造器可以同时声明字段。

     1 /**
     2  * 主构造器
     3  * @author Administrator
     4  */
     5 //在scala中,类和方法交织在一起
     6 class TestClass51(val name:String = "" ,val age:Int = 0){  
     7   
     8   println("name="+ name + " age=" + age)
     9   
    10 }
    11 
    12 object TestScala51 {
    13   def main(args: Array[String]): Unit = {
    14     val c = new TestClass51(age = 18)
    15   }
    16 }
     1 /**
     2  * 辅助构造器
     3  * @author Administrator
     4  */
     5 //在scala中,类和方法交织在一起
     6 class TestClass52(){  
     7   var name:String = "" 
     8   var age:Int = 0
     9   
    10   def this(name:String){
    11     this()  //第一行调用主构造器
    12     this.name = name
    13   }
    14   
    15   def this(name:String , age:Int){
    16     this(name)  //第一行必须调用主构造器或者其他辅助构造器
    17     this.age = age
    18   }
    19 //  println("name="+ name + " age=" + age)
    20   
    21 }
    22 
    23 object TestScala52 {
    24   def main(args: Array[String]): Unit = {
    25     val c = new TestClass52("zhangsan",20)
    26     println(c.name)
    27     println(c.age)
    28   }
    29 }

    高阶函数

    函数可以赋给变量 首先,在scala中,函数是一等公民。

     

    匿名函数 函数的形式是 (形参列表)=>返回值类型

    函数作为形参

    既然函数可以作为参数,那么在调用的时候我们会传递函数的变量过去。那么,我们可以省略函数的定义,在调用的时候直接把函数的实现(即匿名函数)过去。

    函数作为形参 对于只有一个参数的,可以只写函数体。 fun3(a=>a+2) 如果形参只有一个,可以在函数体中使用_代替。 fun3(_+2) 函数作为形参的终极版本。

    把匿名函数放在函数体内

      1 /**
      2  * 高阶函数 要为spark做铺垫的话一定要讲高阶函数
      3  * Scala中的语法很灵活,公司要自己统一开发规范. 声明方法可以用def 还可以用val和var
      4  * @author Administrator
      5  */
      6 object TestScala53 {
      7   def main(args: Array[String]): Unit = {
      8 //================================================================    
      9     //在scala中把函数称之为一等公民 
     10     def add(a:Int , b:Int) = {
     11       a + b
     12     }
     13     val c = add(3,2)
     14     println(c)//打印5
     15 //================================================================    
     16     
     17     //需求 将一个函数的实现传递给另外函数
     18     //应用场景:将一个函数指定另外一个别名;传递函数的实现给另外的函数
     19     def func1 = add _  //指的是将一个函数的实现传递给另外一个函数  而不是忘记了给该函数传递参数
     20     println(func1(1,3))//打印4
     21     
     22 //================================================================
     23     
     24     def func2 = (x:Int) => {x + 2}  //匿名函数
     25     println(func2(100))//打印102
     26     
     27 //================================================================
     28 
     29     //定义一个接收函数的函数
     30     def func3(f:(Int) => Int) = {
     31       f(100) * 2
     32     }
     33     
     34     def func4(a:Int) = {
     35       a + 1
     36     }
     37     println(func3(func4 _))//打印202 (100+1)*2  传递一个已有的函数给func3
     38     
     39     println(func3((x:Int) => x + 10))//打印 220 (100+10)*2=220 将一个匿名函数传递给func3
     40     
     41     //Scala中总有一些你意想不到的写法
     42     println(func3((x) => x + 10))//打印 220 简写一 类型简写,去掉Int类型 x的类型,程序自己推断
     43     println(func3( x => x + 10 ))//打印 220 简写二
     44     println(func3(_ + 10))  //打印 220 简写三
     45     
     46       /*
     47                 以上简写的条件
     48       1.匿名函数作为参数
     49         2.只有一行代码
     50         */
     51 //================================================================
     52     
     53     def func5(f:(Int,Int) => Int) = {
     54       f(2,3)
     55     }
     56     println(func5((x:Int,y:Int) => x + y))//打印5
     57     println(func5((x,y) => x + y)) //打印5 简写一
     58     println(func5(_ + _)) //打印5 简写二
     59       
     60       /*
     61                总结“_” 所能代表的意义
     62         1、用于取元组值
     63         2、代表一个占位符
     64         3、指的是将一个函数的实现传递给另外一个函数  而不是忘记了给该函数传递参数
     65         4、代表符合条件的每一个元素
     66         */
     67     
     68 //================================================================
     69     
     70     /*常见的高阶函数*/
     71     //1.filter map
     72     var d = (1 to 10).filter( _ % 2 == 1).map(_ * 3)
     73     println(d.mkString(","))//打印 3,9,15,21,27
     74     //filter( _ % 2 == 1) 过滤出1,3,5,7,9
     75     
     76     var e = (1 to 10).filterNot( _ % 2 == 1)
     77     println(e.mkString(","))//打印 2,4,6,8,10
     78     
     79     var f = (1 to 10).reduceLeft(_ + _)//reduceLeft是左累加  1+2 3+3 6+4 .....(1+2+3+...+10=55) 
     80     println(f)//打印 55
     81     
     82     (1 to 10).map("*" * _).foreach(println _)
     83     //foreach是操作前面产生的每个元素
     84     /*
     85              打印输出
     86           *
     87           **
     88           ***
     89           ****
     90           *****
     91           ******
     92           *******
     93           ********
     94           *********
     95           **********     
     96      */
     97     
     98 //================================================================
     99     
    100     //练习
    101     def func6(x:Int) = {
    102       (x:Int) => {
    103         x + 2
    104       } * 2
    105     }
    106     println(func6(1))//打印输出 <function1> 传递进去参数之后就一个函数.
    107     println(func6(1)(2))//打印输出8 (如果把x:Int改成y:Int 就会输出6)就近原则
    108   }
    109 }
  • 相关阅读:
    HashMap 链表插入方式 → 头插为何改成尾插 ?
    MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
    Eclipse
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
    Delphi
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5645384.html
Copyright © 2020-2023  润新知