一.高阶函数

一.函数式编程中函数的特点

  1. 可以创建匿名函数
    def声明带名函数,val声明匿名函数
    scala scala> def triple(x:Int):Int = {3*x} scala> triple(2) res1: Int = 6
    scala scala> val triple = (x:Int) => 3*x scala> triple(2) res0: Int = 6

  2. 函数和数字一样,可以作为参数被传递和操作
    scala scala> val fun = scala.math.ceil _ // _ 把函数转变为变量 scala> Array(1.1,2.2,3.3).map(fun) res2: Array[Double] = Array(2.0, 3.0, 4.0)

  3. 声明以函数为参数的函数
    以函数为参数时,要给出函数名,参数类型,返回值类型,作为算法的约束条件。eg:f:(Double)=>Double
    以函数为参数的函数,他的函数体要用声明前面的函数名。eg:f(0.25)
    ```scala
    scala> def valeOnQuarter(f:(Double)=>Double) = f(0.25)
    valeOnQuarter: (f: Double => Double)Double

    scala> valeOnQuarter(scala.math.ceil _)
    res4: Double = 1.0
    匿名函数作为参数传递给另一个函数作为算法时,该匿名函数会自行做参数类型推断,自动识别算法的参数和返回值类型,可以不去声明scala
    // 匿名函数作为算法的完整写法
    scala> valeOnQuarter((x:Double)=>3x)
    res5: Double = 0.75
    // 参数值推断的写法
    scala> valeOnQuarter(x=>3
    x)
    res6: Double = 0.75
    // 终极简化写法
    scala> valeOnQuarter(3*_)
    res7: Double = 0.75
    【注】:匿名函数作为参数值时,之所以可以做参数类型推断,是因为以算法为参数的函数的函数体给出了参数值。如果把一个val变量声明为匿名函数,则要给出参数类型,以便scala推断返回值类型scala
    scala> val fun = 3*( _: Double)
    fun: Double => Double =

    scala> fun(2)
    res8: Double = 6.0
    ```

二.集合类中有用的高阶函数(算法为参数)

  1. map与foreach

    scala> (1 to 4).map("*" * _).foreach(println)
    *
    **
    ***
    ****
  2. filter

    scala> (1 to 9).filter(_% 2==0)
    res14: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8)
  3. reduceLeft

    scala> (1 to 4).reduceLeft(_*_)
    res16: Int = 24
  4. sortWith

    scala> "i have a dream".split(" ").sortWith(_.length < _.length)
    res21: Array[String] = Array(i, a, have, dream)

三.闭包

  1. 闭包:
    一个函数的函数体内,所用到的变量没有全部在函数内部定义。函数内部定义的变量称为绑定变量,函数未定义的称为自由变量。此时含有未定义变量的函数文本处于“开放”状态,当自由变量根据函数上文动态推断而来后,函数文本“关闭”,次过程称为函数的闭包。
    即:函数从变量个数 > 参数列表个数到变量个数 = 参数列表个数的过程,称为闭包
    scala scala> val more=1 scala> def add(x:Int)={x+more} // 函数内部没有给出more的定义,而是根据上文的more=1推断而来 scala> add(1) res0: Int = 2

  2. 闭包的高级形式:匿名函数中包含第二个绑定变量
    ```scala
    scala> def add(more:Int)={(x:Int)=>x+more} // add函数内部有2个参数,却只有一个参数列表

    scala> val add1=add(1) // 此时add1的变量个数和参数列表个数相同
    add1: Int => Int =

    scala> add1(2)
    res2: Int = 3
    ```

四.柯里化

  1. 柯里化:
    柯里化是一种函数的书写格式,他把多参函数,转化为拥有一个参数的函数
    柯里化将单个参数单拎出来,以构建用于类型推断的函数
    eg:闭包中的def add(more:Int)={(x:Int)=>x+more},add函数实际上有2个参数,more和x
    ```scala
    scala> def add(x:Int,y:Int)=x+y // 2参函数的一般形式

    scala> def add(x:Int)=(y:Int)=>x+y // 柯里化后的1参函数
    add: (x: Int)Int => Int

    scala> add(1) // 类型推断后,add(1)=(y:Int)=>1+y
    res5: Int => Int =

    scala> add(1)(2)
    res6: Int = 3
    柯里化简写形式scala
    scala> def add(x:Int)(y:Int)=x+y
    add: (x: Int)(y: Int)Int

    scala> add(1)(2) //add(1)(2)的调用,先转化为add(1)函数,再给这个函数传参2
    res7: Int = 3
    ```

五.控制抽象

  1. scala有一个函数级别的模板设计模式,为一个算法起一个别名,声明返回值类型,在函数体内,用这些别名形成操作模板。调用这种模板函数时,可以将一系列语句组成用大括号扩起来形成函数语句块,把语句块作为参数传进这个模板函数
    eg:用控制抽象实现while..until的语法:
    ```scala
    scala> def until(condition: =>Boolean)(fun: =>Unit){
    | if(!condition){
    | fun
    | until(condition)(fun)
    | }
    | }
    until: (condition: => Boolean)(fun: => Unit)Unit

    scala> a=5
    scala> until{a==1}{a-=1
    | println(a)
    | }
    4
    3
    2
    1

    ```

转载于:https://www.cnblogs.com/72808ljup/p/5376519.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程和进程的区别?

进程是操作系统分配资源的最小单元&#xff0c;线程是操作系统调度的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。

收集12个经典的程序员段子

1bug 跟蚊子的相似之处&#xff1a;1、不知道藏在哪里。2、不知道有多少。3、总是在你即将睡觉休息的时候出现。2A&#xff1a;最近在看《一拳超人》&#xff0c;觉得咱们程序猿跟埼玉老师有点像啊&#xff01;B&#xff1a;哪里像了&#xff1f;A&#xff1a;越秃越强&#xf…

2020mysql安装教程_2020MySQL安装图文教程

MySQL安装图文教程(Windows10)1、MySQL下载可以去MySQL官网下载&#xff0c;或者在我提供的百度云链接下载。官网下载网速较慢&#xff0c;我从官网下载了将近四个小时&#xff0c;然后把下载好的放在了百度网盘&#xff0c;需要的而已自取。MySQL官网地址&#xff1a;MySQL官网…

说一下 runnable 和 callable 有什么区别?

主要区别 Runnable 接口 run 方法无返回值&#xff1b;Callable 接口 call 方法有返回值&#xff0c;支持泛型Runnable 接口 run 方法只能抛出运行时异常&#xff0c;且无法捕获处理&#xff1b;Callable 接口 call 方法允许抛出异常&#xff0c;可以获取异常信息 Runnable Ca…

几种常见的光纤接头(ST,SC,LC,FC)以及PC、APC和UPC的区别

一、几种常见的光纤接头(ST,SC,LC,FC)FC型光纤连接器&#xff1a;外部加强方式是采用金属套&#xff0c;紧固方式为螺丝扣。 一般在ODF侧采用(配线架上用的最多)SC型光纤连接器&#xff1a;连接GBIC光模块或普通光纤收发器的连接器&#xff0c;它的外壳呈矩形&#xff0c;紧固方…

nginx配置ssl

1.使用pfx证书配置ssl &#xff08;http://www.heartlifes.com/archives/12/&#xff09; 。上传证书 。生成证书crt及key文件 openssl pkcs12 -in /usr/local/nginx/ssl/xxx.pfx -clcerts -nokeys -out /usr/local/nginx/ssl/xxx.crt openssl pkcs12 -in /usr/local/nginx/ssl…

python开发客户端_python用700行代码实现http客户端

本文用python在TCP的基础上实现一个HTTP客户端, 该客户端能够复用TCP连接, 使用HTTP1.1协议.一. 创建HTTP请求HTTP是基于TCP连接的, 它的请求报文格式如下:因此, 我们只需要创建一个到服务器的TCP连接, 然后按照上面的格式写好报文并发给服务器, 就实现了一个HTTP请求.1. HTTPC…

家里网线的接法和顺序

对于网线&#xff0c;大伙都熟悉吧&#xff0c;它是电脑连接时必不可少的一种设备。但是许多网友却和小编一样&#xff0c;不知道如何连接网线&#xff0c;导致电脑无法上网&#xff0c;下面我们就来详细介绍一下&#xff1a;如何接网线以及家里网线的接法和顺序&#xff1f;希…

String str=Hello 与 String str=new String(“Hello”)一样吗?

为什么会输出上边的结果呢&#xff0c;String x "Hello" 的方式&#xff0c;Java 虚拟机会将其分配到常量池中&#xff0c;而常量池中没有重复的元素&#xff0c;比如当执行“Hello”时&#xff0c;java虚拟机会先在常量池中检索是否已经有“Hello”,如果有那么就将…

盘点程序员最喜欢的15个网站

程序员作为一个经常和互联网打交道的人群&#xff0c;他们喜欢浏览哪些网站呢&#xff1f;不爱敲代码的程序猿整理了以下网站供大家参考&#xff0c;排名不分先后&#xff1a; 0. Google https://google.com 这个不用多说了吧。 1.GitHub 开发者最最最重要的网站&#xff1a;h…

简单的反射 把datatable 转换成list对象

/// <summary>/// 把datatable 转换成list对象/// </summary>/// <typeparam name"T"></typeparam>/// <param name"dt"></param>/// <returns></returns>public List<T> SelectsAll<T>(Data…

mysql 取 映射数据库中_JAVA与数据库MySQL相连接

JDBC(Java数据库连接体系结构)&#xff1a;是Java实现数据库访问的应用程序编程接口&#xff0c;主要功能是管理存放在数据库中的数据。通过接口对象&#xff0c;应用程序可以完成与数据库的连接&#xff0c;执行SQL语句&#xff0c;从数据库中获取结果&#xff0c;获取状态以及…

抽象类必须要有抽象方法吗?

答案是&#xff1a;不必须。 这个题目主要是考察对抽象类的理解。 说一下我个人的理解吧。 1.如果一个类使用了abstract关键字修饰&#xff0c;那么这个类就是一个抽象类。 2.抽象类可以没有抽象方法 3.一个类如果包含抽象方法&#xff0c;那么这个类必须是抽象类&#xf…

python序列化和反序列化_Python 中 json 数据序列化和反序列化

1.Json 定义定义&#xff1a;JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。JSON 的数据格式其实就是 python 里面的字典格式&#xff0c;里面可以包含方括号括起来的数组&#xff0c;也就是python里面的列表。特点&#xff1a;简洁和清晰的层次…

重写navigationController的push方法后,出现卡顿现象

在使用navigation的pushViewController进行push的时候&#xff0c;两个页面间的动画会出现卡顿一下再推出的效果&#xff0c;是因为iOS7 viewController背景颜色的问题&#xff0c;看到大神的博客上说&#xff1a;其实不是卡顿&#xff0c;是由于透明色颜色重叠后视觉上的问题&…

硬件:RS232基础知识笔记

个人计算机上的通讯接口之一&#xff0c;由电子工业协会&#xff08;ElectronicIndustriesAssociation&#xff0c;EIA&#xff09;所制定的异步传输标准接口。通常RS-232接口以9个引脚&#xff08;DB-9&#xff09;或是25个引脚&#xff08;DB-25&#xff09;的型态出现&#…

普通类和抽象类有哪些区别?

抽象类不能被实例化抽象类可以有抽象方法&#xff0c;抽象方法只需申明&#xff0c;无需实现含有抽象方法的类必须申明为抽象类抽象类的子类必须实现抽象类中所有抽象方法&#xff0c;否则这个子类也是抽象类抽象方法不能被声明为静态static抽象方法不能用 private 修饰&#x…

正则表达式格式化日期

var str "2016年4月11日";str str.replace(/[\u5e74|\u6708]/g,"-").replace(/\u65e5/g,""); 转载于:https://www.cnblogs.com/smght/p/5379514.html

硬件:RS422基础知识笔记

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

mysql和php数据交互_php mysql交互

1.接受数据if($_POST){$uname trim($_POST[‘uname‘]);$pasd md5($_POST[‘pasd‘]);2.查询数据库$conn new mysqli(‘localhost‘,‘root‘,‘root‘,‘qiye‘);$sql "select * from admin where uname ‘$uname‘ and pasd ‘$pasd‘ ";$res $conn->que…