zoukankan      html  css  js  c++  java
  • 大数据学习之Scala语言函数学习37

    五:scala函数

    1函数创建方式

    方式1方法转换为函数

    方式:方法名 _

    res6: (Int, Int) => Int = <function2>

    <function2>

    代表一个函数,并且有两个参数。

    (Int, Int)

    代表参数列表

    Int

    代表返回值类型

    =>

    代表函数

    方式2 定义函数:

    val h1 = (a:Int,b:Int) => {a * b}

    h1:函数名

    (a:Int,b:Int):函数的参数类型

    {a * b}:函数体

    2传值调用&传名调用

    函数式编程:方法的参数可以是一个函数

    编写代码来说明这个问题

    package dawn.day02
    
    /**
      * @author Dawn
      * 2019年6月11日17:56:52
      * @version 1.0
      * 传值调用&传名调用 测试
      */
    object ZFBToPay {
    
      var money=1000
    
      //每次吃饭花50
      def eat()={
        money-=50
      }
    
      //余额
      def balance():Int={
        //已调用一次eat方法
        eat()
        money
      }
    
      //传值调用:传递的是函数 call by value
      def printMoney1(x:Int):Unit={
        for(a <- 1 to 5){
          println(s"你的余额现在为:$x")
        }
      }
    
      //传名调用测试 (实际上传的是一个函数)call by name
      //此时余额减了5次 x: => Int 表示的是一个方法的签名 没有参数 返回值是int类型的函数
      def printMoney2(x: => Int):Unit={
        for(a <- 1 to 5){
          println(s"你的余额现在为:$x")
        }
      }
    
      def main(args: Array[String]): Unit = {
        //    eat()
        //    balance()
        //传值调用: call by value,这里就相当只调用了一次
    //    printMoney1(balance())
    
        //传名调用 call by name,函数实参每次在函数体内被用到时都会求值
        printMoney2(balance)
      }
    }
    

      

    传值调用:

    1.先计算balance的值

    2.把这个值作为参数传递给printMoney

    运行结果:

    传名调用:传递的是函数

    balance方法的名称传递到方法内部执行

    运行结果:

    3 可变参数函数

    java中的可变参数:public static void m1(String ...arg){}

    scala中的可变参数:def sum(ints:Int*): Int ={}

    加了通配符*

    代码如下:

    package dawn.day02
    /**
      * @author Dawn
      * 2019年6月11日18:22:13
      * @version 1.0
      * 测试函数的可变参数
      */
    object ManyParam {
    
      def sum(moneys:Int*):Int={
        var sum=0
        for (v <- moneys){
          sum+=v
        }
        sum
      }
    
      /*
          不仅是可变参
          而且参数的类型不一致
          Any
         */
      def setName(params:Any*):Any={
        return params
      }
      def main(args: Array[String]): Unit = {
        println(sum(1,5,6,4))
        println(setName("dawn",20,"渴望恋爱"))
      }
    }
    

     

    运行结果

    4 默认参数值函数

    如果传递了参数,则使用传递的值。如果不传递参数,则使用默认

    运行结果如下:

    5高阶函数

    定义:将其他函数作为参数,或者其结果是函数的函数。

    示例1

    *)首先,定义一个最普通的函数

    *)再定义一个高阶函数

    *)分析这个高阶函数调用的过程

    示例2

    在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunctionmyFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。

    6 部分参数应用函数

    如果函数传递所有预期的函数,则表示完全应用它了。

    如果只传递几个参数,并不是全部参数,那么将返回部分应用的函数。

     

    运行结果如下:

     

    7 字符串的格式化输出

    文字插值器:f/s

    就使用上面部分参数应用函数的代码。其中f s都是一样的效果

    8 柯理化

    柯里化函数(Curried Function)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。

    一个简单的例子:

    总结:函数的通用性降低,但是适用性提高

    9偏函数

    被包在花括号内没有match的一组case语句的是一个偏函数。 PartialFunction[A,B]

     A:参数类型

    B:返回类型

    常用与模式匹配

    运行结果

  • 相关阅读:
    runc create container 流程分析
    cri-o pod 创建源码分析
    hyperstart 容器创建流程分析
    MIT jos 6.828 Fall 2014 训练记录(lab 4)
    python 邮件发送 脚本
    jvm: 理解gc日志
    jvm:垃圾收集器
    GC 垃圾收集
    jvm结构
    Java transient关键字使用小记
  • 原文地址:https://www.cnblogs.com/hidamowang/p/11006384.html
Copyright © 2011-2022 走看看