• spark学习进度3——Scala方法与函数


    一、Scala中的方法

    1、方法:方法是对一段代码的封装或者是对代码的抽取,为了实现某个功能,方法定义完成以后不会自动执行,需要手动进行调用。

    2、Java中定义方法: 

    public\protected\private\default\friendly  returnType  methodName(argType  arguments....){ 方法体 }

    3、Scala中定义方法:

    scala中定义方法的关键字是:def;

    scala中方法类型是后置定语;

    def methodName(arg:Type......): ={ } 

    备注:scala中方法的返回值可以加也可以不加,如果不加返回值类型系统会自适配

    例:定义求和的方法

    1   def main(args: Array[String]): Unit = {
    2     val re=sum(100,80)
    3     println("计算总和是:"+re)
    4   }
    5   def sum(num1:Int,num2:Int):Double={
    6     val res=num1+num2
    7     return res
    8   }

    4、Scala中方法定义的时候如果方法名后面没有添加小括号,在调用的时候不能添加小括号,如果方法名称有小括号,那么在调用的时候可以添加小括号,也可以不添加小括号

    例:

    1   def main(args: Array[String]): Unit = {
    2     printInfo            //调用不能添加()
    3   }
    4   def printInfo:Unit={   //方法中没有()
    5     println("hello world")
    6   }

    5、如果方法中的参数是多个并且数据类型一样,可以使用*代替。可变参数。

     1   def main(args: Array[String]): Unit = {
     2     val result = sum(11,22,33,44,55)
     3     println("累加和是:"+result)
     4   }
     5   //定义参数个数不确定的求和方法
     6   def sum(number:Int*):Int= {
     7     var res = 0
     8     for(n<-number){
     9       res+=n
    10     }
    11     return res
    12   }

    1   def main(args: Array[String]): Unit = {
    2     val result = sum(11,22,33,44,55)
    3     println("累加和是:"+result)
    4   }
    5   //定义参数个数不确定的求和方法
    6   def sum(number:Int*):Int= {
    7     number.sum
    8   }

     6、方法中的返回值

    (1)返回值关键字是return

    (2) 方法中如果最后没有返回值类型不能使用return关键字

    (3)方法中没有返回值不能使用return关键字

    (4)方法中不添加return关键字,返回值类型会自己适配。

    (5)方法中如果使用return关键字,方法中必须添加返回值类型

    例:阶乘练习

     1   def main(args: Array[String]): Unit = {
     2     val result = jiecheng(5)
     3     println("5!="+result)
     4   }
     5   def jiecheng(number:Int):Int={
     6     if(number==1) {
     7       return number
     8     }else{
     9       return number*jiecheng(number-1)
    10     }
    11   }


     二、Scala中的函数

    1、函数是方法的另一种体现形式,也是一段代码的综合体,函数约等于方法

    2、Scala中的函数定义

    关键字:val

    [scala中函数是可以被传递的,那么可以把函数理解为一个值,既然是值那么定义的时候使用val关键字]

    语法:

    val  functionName=(参数:参数类型.....)=>逻辑

    val  functionName=(number:Int,number1:Int)=>number1+number

    3、函数名称后面不能添加小括号,方法名称后如果没有参数可以不加( ),有参数必须添加()

    1   def main(args: Array[String]): Unit = {
    2     val sum=(a:Int,b:Int)=>(a+b)
    3     val res=sum(100,200)
    4     println("计算总和是:"+res)
    5   }

     4、函数签名信息

     (1)函数的签名信息: 函数名称:{参数类型,参数类型}=>返回值类型=<实现的接口名称>

    (2)function2:参数有N个,定义出来的函数签名信息functionN,但是最多不能超过0-22个。  【 函数参数个数: 最少0个,最多22个 】

    (3)FunctionN是一个trait特质【接口】,接口中都会有一个构造器apply(N参数)

    我们声明的函数,其实是在实现特质,所参数只能放置22个。【其实定义好的函数不是自己定义的,而是在实现定义好的接口】

     5、匿名函数

    即没有名称的函数

    例:将数组中的每个元素*10

    1   def main(args: Array[String]): Unit = {
    2     val arr=Array(11,22,33,44,55)
    3     val ints:Array[Int]=arr.map((a:Int)=>a*10)
    4     for(arr1<-ints){
    5       print(arr1+" ")
    6     }
    7   }

     6、Scala中的高阶函数

    (1)函数作为返回值

    (2)函数作为方法的参数进行传递

     1 //定义方法,参数是一个匿名函数
     2   def sum(function:(Int,Int)=>Int):Int={
     3     return function(11,22)
     4   }
     5   //定义函数让方法进行调用
     6   val f=(a:Int,b:Int)=>(a+b)
     7   def main(args: Array[String]): Unit = {
     8     //调用方法,方法的参数是一个函数
     9     val i=sum(f)
    10     println(i)
    11   }

     注意:

    • 方法中是形参不能直接定义具体的函数,应该定义一个规范。

    • 函数其实是定义了一种规范,然后将规范进行传递,具体怎么实现,在调用的时候再做具体的实现


     三、方法和函数区别

    1、函数是方法的另一种体现形式,但是方法就是方法,只能被调用。

    2、函数可以作为一个值【值是有签名信息的】在方法中作为参数进行传递,还能当成返回值使用。

    3、Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。

    4、Scala 中的方法跟 Java 的类似,方法是组成类的一部分。Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。

    5、Scala 中使用 val 语句可以定义函数,def 语句定义方法。

    6、Scala中可以将方法转换成函数,使用 _

     

     1   def main(args: Array[String]): Unit = {
     2     val add=(a:Int,b:Int)=>(a+b)
     3     //正常调用方法
     4     var res1=sum(100,200,add)
     5     println(res1)
     6 
     7     //将方法转换成函数调用
     8     val res2=(sum _)(59,22,add)
     9     println(res2)
    10   }
    11   def sum(a:Int,b:Int,f:(Int,Int)=>Int):Int={
    12     return f(a,b)
    13   }

     方法的自动转换:

    1 def main(args: Array[String]): Unit = {
    2     val list=List(12,55,36)
    3     //将println方法放到foreach中作为参数,会自动转换为函数
    4     list.foreach(println)
    5     println("-----------")
    6     //将println方法放到foreach中作为参数,手动转换为函数
    7     list.foreach(println _)
    8   }


    四、方法和函数总结

    1、函数val => 方法def  ={}

    2、函数可以作为表达式单独存在,比如单独放置函数,会出现签名信息,方法不能单独出现,只能被调用。

    3、函数是头等公民,函数式编程(方法不能定义规范,一旦被调用就得去实现,函数可以定义规范而不去实现)。

    4、方法和函数在本质上几乎一样,方法就是函数的另一种体现形式。

    5、函数和和方法进行转换 :空格+下划线,也可以自动转换。

    6、在方法中传递的都是函数【自动转换】。

    7、在scala编程的时候优先使用函数,但是方法用的比较多。

  • 相关阅读:
    centos 启动报错 “error:failure reading sector 0x9b268 from 'hd0'”
    Jenkins安装及插件管理
    svn关联Jenkins自动发布代码
    LVS逻辑卷的创建、扩展、销毁
    Linux上安装SVN服务端及SVN的可视化工具
    CentOS7下配置防火墙放过Keepalived
    Prometheus apache_exporter 监控配置
    CentOS启动报错:Error at boot time: "[Firmware Bug]: TSC_DEADLINE disabled due to Errata
    linux上安装open***
    python学习day15 Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  • 原文地址:https://www.cnblogs.com/znjy/p/15760415.html
Copyright © 2020-2023  润新知