• scala学习之函数


    scala是一种多范式编程语言,其特色之一就是函数式编程,本节就来学习它!

    在变量中存放函数

        val num = 3.14
        val fun = ceil _  // _将ceil方法转换成了函数
        println(fun(num))
        val array = Array(3.14,1.4,2.0).map(fun) // 4.0 2.0 2.0

    匿名函数

      val triple = (x:Double) => x*3
      println(triple(2.0))
      Array(3.14,1.4,2.0).map((x:Double) => x*3)

    高阶函数
    在scala中,函数可以作为函数的参数,比如

    def value(f:(Double) => Double) = f(2.5)

    这个函数接受任何Double并返回Double类型的函数

    value(sqrt _)

    这种接收一个函数参数的函数 就被称作为高阶函数。
    高阶函数也可以产出另一个函数:

      def mulBy(factory : Double) = (x:Double) => x*factory
    
      print(mulBy(3)(20))  //60

    常用的高阶函数

    (1 to 9) map(0.1 * _) foreach( println _)

    声明下,这个不会得到你想要的结果,即 0.1 0.2 0.3 …

    0.1
    0.2
    0.30000000000000004
    0.4
    0.5
    0.6000000000000001
    0.7000000000000001
    0.8
    0.9

    这个是所有的编程语言都会出现的问题,scala不是个例,至于原因,请参考这里

    (1 to 100) filter (_ % 3 == 0) foreach (println _)
    (1 to 9) reduceLeft(_*_)
    "scala is a program run on JVM".split(" ").sortWith(_.length < _.length) foreach( println _)

    闭包
    曾经学习JS时,闭包是我最痛苦的回忆,后来我看到过一个关于闭包比较好理解的解释:当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。

      def mulBy(factory: Double) = (x: Double) => x * factory
    
      val triple = mulBy(3)
      val half = mulBy(0.5)

    triple 和 half 都有各自的对函数的引用,这样的函数成为闭包,闭包由代码和代码用到的任何非局部变量定义构成。

    用放荡不羁的心态过随遇而安的生活
  • 相关阅读:
    .net core app的几个依赖究竟是什么
    ocelot identityserver4 consul整合漫谈
    错位重排算法公式的理解
    IIS证书配置。。这究竟是为什么
    .net core修改IIS发布的环境变量
    服务注册和发现组件-consul
    记一次失败的ubuntu虚拟机配置过程。。。
    .net core统一认证学习笔记(一)ocelot分析
    第四天
    第三天
  • 原文地址:https://www.cnblogs.com/re-myself/p/5532483.html
Copyright © 2020-2023  润新知