专栏首页无题~scala:把函数作为值或参数进行传递、作为返回值进行返回,以及什么是闭包和柯里化

scala:把函数作为值或参数进行传递、作为返回值进行返回,以及什么是闭包和柯里化

函数可以作为值进行传递

  • 语法var f = 函数名 _
  • 如果明确了变量的数据类型,那么下划线可以省略
//函数正常的声明与调用
    def foo():Int={
      println("foo...")
      10
    }
    //将foo函数的执行结果赋值给res变量
    //val res: Int = foo()
    //println(res)

    //函数作为值进行传递  语法:在函数名称的后面  +  空格  加下划线
    //注意:将foo函数作为一个整体,赋值给f变量,  f是函数类型 ()=>Int
    //val f : () => Int = foo _
    def f : () => Int = foo _


    //这个时候,f就是一个函数,如果要想运行f函数的话,必须得加()
    //println(f)   //<function0>
    //println("-----------------")
    //println(f())

    //var ff = foo   //将函数执行结果赋值给ff
    //var ff = foo _   //将函数本身作为值赋给ff

    //将函数本身作为值赋给ff    如果明确了变量的类型,那么空格和下划线可以省略
    //var ff:()=>Unit = foo
    //println(ff)

函数可以作为参数进行传递

  • 通过匿名函数
  • 扩展函数的功能
  • 提高函数的灵活度
  //函数可以作为参数,进行传递(大多数情况都是通过匿名函数的形式)
    //定义一个函数calculator,该函数接收一个函数类型的参数op,op定义了对两个整数要进行什么样的操作
    def calculator(a:Int,b:Int,op:(Int,Int)=>Int): Int ={
      op(a,b)
    }

    //定义一个函数f1,完成两个整数的加法运算
    def op(a:Int,b:Int):Int={
      a + b
    }
    //println(calculator(10,20,op))
    println(calculator(50, 20, (a: Int, b: Int) => {
      a - b
    }))

    println(calculator(50, 20, _ - _))
    println(calculator(50, 20, _ + _))
    */

函数可以作为返回值进行返回

  • 函数的嵌套
  • 函数链式调用,通过参数传递数据,在执行的过程中,函数始终占据栈内存,容易导致内存溢出
//函数可以作为返回值进行返回----函数的嵌套
    def f1():()=>Unit ={
      def f2(): Unit ={
        println("f2函数被调用了")
      }
      //将f2作为返回值返回给f1
      f2 _
    }

    //ff就是f2
    //var ff = f1()
    //ff()

    //f1()()

闭包

内层函数访问外层函数的局部变量,会自动延长外层函数局部变量的生命周期,与内层函数形成一个闭合的效果,我们称之为闭包

/*
    def f1(): (Int)=>Int ={
      var a:Int = 10
      def f2(b:Int): Int ={
        a + b
      }
      f2 _
    }
    */

    //执行f1函数返回f2,将返回的f2赋值给ff变量
    //val ff: Int => Int = f1()

    //闭包:内存函数f2要访问外层函数f1局部变量a,当外层函数f1执行结束之后,f1会释放栈内存,但是会自动的延长f1函数的局部变量的生命周期,
    //    和内层函数f2形成一个闭合的效果,我们将这种闭合的效果称之为闭包

    //如果存在闭包,那么编译器会生成包含$anonfun$的字节码文件

    //闭包  = 外层函数的局部变量  + 内层函数

    //调用ff函数,其实就是调用f2
    //println(ff(20))

    //也可以直接通过如下方式调用
    //println(f1()(30))


    println("-----------------------------------")
    //以上代码可以转换为如下代码
    /*
    def f3() ={
      var a:Int = 10
      (b:Int) => a + b
    }

    f3()(30)
    */

柯里化

  • 将一个参数列表中的多个参数,拆分为多个参数列表
  • 好处1:每一个参数列表表示函数清晰明确
  • 好处2:简化闭包代码的编写
//柯里化
    //将一个函数的一个参数列表中的多个参数,拆分为多个参数列表
    //简化闭包代码的编写
    def f4()(b:Int):Int = {
      var a:Int = 10
      a + b
    }
    println(f4()(20))

    //f4在执行的时候,其实会转换为以下结构
    /*
    def f4() ={
      var a:Int = 10
      (b:Int) => a + b
    }

什么是匿名函数

  • 参数的类型可以省略,会根据形参进行自动的推导
  • 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过1的永远不能省略圆括号。
  • 匿名函数如果只有一行,则大括号也可以省略
  • 如果参数只出现一次,则参数省略且后面参数可以用_代替
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.cnblogs.com/sunbr/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • scala快速入门系列【高阶函数】

    本篇作为scala快速入门系列的第三十六篇博客,为大家带来的是关于高阶函数的内容。

    大数据梦想家
  • 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法

    Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他类型处于同等的地位,可以像其他任何数...

    Lanson
  • Scala的函数

    云飞扬
  • scala(七) 函数式编程补充

    说明: 没有名字的函数就是匿名函数,可以直接通过函数字面量(λ表达式)来设置匿名函数,函数字面量定义格式如下。

    用户1483438
  • 04.Scala:高阶函数、隐式转换

    scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他类型处于同等的地位,可以像其他类型的...

    ChinaManor
  • Scala:高阶函数、隐式转换(四)

    scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他类型处于同等的地位,可以像其他类型的...

    ChinaManor
  • 函数式编程杂谈

    比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算。本文通过函数式编程的一些趣味...

    2020labs小助手
  • 一文带你了解JavaScript 函数式编程

    函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。

    心莱科技雪雁
  • 一文带你了解JavaScript函数式编程

    函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。

    Fundebug
  • 深入理解JavaScript函数式编程

    什么是函数式编程(Functional Programming, FP):FP 是编程范式之一.(还有面向过程编程、面向对象编程)

    用户3045442
  • 一文带你了解JavaScript函数式编程?

    函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。

    猿哥
  • 函数式编程简介

    函数式编程是如何编写程序的方法论,主要思想是把运算过程尽量写成一些列嵌套函数的调用。 可以归结为面向过程编程,把复杂任务分解成简单的任务

    epoos
  • JavaScript 函数式编程

    函数式编程是一种编程范式,主要是利用函数把运算过程封装起来,通过组合各种函数来计算结果。 举个例子,要把字符串 functional programming ...

    Leophen
  • 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数.md

    For example, in Lisp the 'square' function can be expressed as a lambda expressi...

    一个会写诗的程序员
  • JavaScript 设计模式学习第三篇- 闭包与高阶函数

    JavaScript 的函数也是对象,可以有属性,可以赋值给一个变量,可以放在数组里作为元素,可以作为其他对象的属性,什么都可以做,别的对象能做的它能做,别的对...

    越陌度阡
  • Scala学习笔记

    大数据框架(处理海量数据/处理实时流式数据) 一:以hadoop2.X为体系的海量数据处理框架         离线数据分析,往往分析的是N+1的数据  ...

    曼路
  • 【Python环境】Python函数式编程指南(2):函数

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: def add(x, y): return x + y 关于参数和返回值的语法细节可以参考...

    陆勤_数据人网
  • Scala的基础概念

    例如:调用 def Add(y:Int) = x + y 其结果为xy之和,并且调用之后没有引起x值的变换,没有副作用 所以,Add函数没有副作用

    ZONGLYN
  • Scala专题系列(七):高阶函数

    val num = 2.2 val fun = scala.math.ceil _

    用户5252199

扫码关注腾讯云开发者

领取腾讯云代金券