一.本章要点

  • 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他);
  • 可以创建匿名函数,通常还会交给其他函数;
  • 函数参数可以给出需要稍后执行的行为;
  • 许多集合方法都接受函数参数,将函数应用到集合中的值;
  • 有许多语法上的简写让你以简短且易读的方式表达函数参数;
  • 可以创建操作代码块的函数,像是内建的控制语句

二.作为值的函数

  在Scala中,函数是头等公民,和数字一样,在变量中存放函数:

import scala.math._
val num=3.14
val fun=ceil _
//注:ceil函数后的_意味确实指的这个函数,而不是忘记传参数,可以调用它,传递它

三.匿名函数

  没有函数名的函数,例val triple=(x:Double) => 3*x等同于def triple(x:Double)=3*x。

  Array(3.14,1.43,2.0).map((x:Double)=>3*x),map也可以用{},Array(3.14,1.43,2.0).map{(x:Double)=>3*x},Array(3.14,1.43,2.0) map {(x:Double)=>3*x}

四.带函数参数的函数

  如 def valueAtOneQuarter(f:(Double) => Double)=f(0.25),可以接受参数的函数,也是高阶函数,类型是(参数类型) = >结果类型,则该函数为((Double)=>Double)=>Double,也可以返回一个函数,例def nulBy(factor:Double)=(x:Double)=>factor*x,类型为(Double)=>((Double)=>Double)。

五.参数(类型)推断

  当将一个匿名函数传递给另一个函数或者方法时,Scala会尽可能帮你推断出类型信息,例:valueAtOneQuarter((x:Double)=>3*x)简写为valueAtOneQuarter((x)=>3*x),一个参数还可以valueAtOneQuarter(x=>3*x),如果=>只出现一次,还可以valueAtOneQuarter(3* _)。

六.一些有用的高阶函数

  map作用到某个集合的所有元素并返回结果,foreach也是作用于某个集合的所有元素但无返回值,fileter接受集合筛选匹配特定条件的值,reduceLeft接受二元函数,并应用到序列所有函数。  

七.闭包

  能够读取其他函数内部的函数,由代码和代码用到的任何非局部变量定义构成。  

八.SAM转换

  SAM:在Java中,将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法,且这些接口只有单个抽象方法,这被叫做SAM模型。

  需要用到隐式转换(implicit),例:

九.柯里化

  指将原来接受两个参数的函数变为新的接受一个参数的函数的过程,有时候需要把某个参数拿出来提供更多用于类型判断的信息。

  如:def mul(x:Int,y:Int)=x*y转换为def mulOnrAtTime(x:Int)=(y:Int)=>x*y,还可以简写为def nulOneAtTme(x:Int)(y:Int)=x*y

十.控制抽象

  将一系列语句组成不带参数也没有返回值的函数。

def runInThread(block:()=>Unit){
new Thread{
override def run(){block()}
}.start()} //调用
runInThread(println("Hi");Thread.sleep(10000);println("Bye")) //利用换名表示方法省掉=>
def runInThread(block:=>Unit){
new Thread{
override def run(){block()}.start()}
}
//调用
runInThread(println("Hi");Thread.sleep(10000);println("Bye"))

十一.return表达式

  在Scala中,不需要用return语句返回函数值,函数的返回值就是函数体的值。

  可以用return来从一个匿名函数中返回值包含这个匿名函数的带名函数,例:

def indexOf(str:String,ch:Char):Int={
var i=0
util(i==str.length){
if(str(i)==ch)return i
i+=1
}
return -1
}

十二.练习

Scala学习十二——高阶函数的更多相关文章

  1. scala学习笔记:高阶函数

    scala> def power(y:Double)=(x:Double)=>Math.pow(x,y) warning: there were 1 deprecation warning ...

  2. JavaScript学习笔记(十)——高阶函数之map,reduce,filter,sort

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  3. python六十课——高阶函数之map

    1.高阶函数: 特点:函数的形参位置必须接受一个函数对象 分类学习: 1).map(fn,lsd1,[lsd2...]): 参数一:fn --> 函数对象 参数二:lsd1 --> 序列对 ...

  4. spark快速开发之scala基础之5高阶函数,偏函数,闭包

    高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...

  5. Python学习笔记系列——高阶函数(map/reduce)

    一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...

  6. Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数

    高阶函数Higher-orderfunction 变量可以指向函数 >>> abs #abs(-10)是函数调用,而abs是函数本身 <built-in function ab ...

  7. Python学习笔记系列——高阶函数(filter/sorted)

    一.filter #filter()函数用于过滤序列.和map()类似,也接收一个函数和一个序列,把函数依次作用于每个元素,根据返回值是True还是False决定是否保留该元素. #filter()函 ...

  8. scala 学习笔记二 方法与函数

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

  9. 【Python学习之六】高阶函数2(map、reduce、filter、sorted)

    3.filter filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素.相当于一 ...

随机推荐

  1. Django之通用视图

    01-介绍 通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图.显示对象列表就是这样一种任务. Django 自带的通用视图能实现下述功能: 1.列出对象并显示单 ...

  2. SpringMVC整合Springfox-Swagger

    https://www.jianshu.com/p/ab10860945c3 验证通过 关于Swagger的简介就不占篇幅了... 本文使用的Springfox-Swagger版本为2.8.0 要整合 ...

  3. o enclosing instance of type ArrayList_day02 is accessible. Must qualify the allocation with an enclosing instance of type ArrayList_day02

    错误日志: 这个错误是因为我创建的一个类,内中又创建了一个内部类,为什么呢在new内部类的时候出现错误呢,因为类中方法(函数)是在是在public static void main(String [] ...

  4. python中计时模块timeit的使用方法

    timeit 模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导 ...

  5. 【JVM学习笔记】ServiceLoader类

    ServiceLoader.load方法的函数原型如下 public static <S> ServiceLoader<S> load(Class<S> servi ...

  6. Mac下配置多个SSH Keys

    Mac下配置多个SSH Keys 生成SSH key # Creates a new ssh key using the provided email # 默认生成的文件名为id_rsa,可以根据命令 ...

  7. Gitlab-Runner基础教程

    一.Intro jenkins和runner,作为主流自动化运维工具来说,两者的大思路其实是一样的,就是将我们提交到代码仓库的代码拉到jenkins或者runner运行的机器里,然后执行一系列的命令( ...

  8. 再次挑戰UCOSII内核源码

    上次打算看UCOSII(嵌入式实时操作系统)源码还是在大四下学期,当时搜集了很多资料源代码.文档.电子书.结果半路放弃了,究其原因  1.知识原因,虽然已经使用C语言一段时间,但是基础并不好,并没有参 ...

  9. Java学习笔记-反射机制

    Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...

  10. JavaScript校验身份证,包含省份、长度、出生年月日、校验位的检测、性别、年龄

    一.代码如下 let vcity = {11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江 ...