在函数式语言中,函数是和value一样地位的一等公民,他可以作为变量,或者作为参数传递给另一个函数

##作为变量
val f=(x:Int)=>x+1
为啥可以这样写?
由于scala是OOP,所以function也是个object。各个function都是继承了Function类,比如Function1类表示参数是1的function类。
 
可见上述f是一个Function1的实例。所以作为实例的f有Function1的所有方法,其中有一个是apply方法,就是当f(1)的时候就会自动调用Function1的x+1这个方法。
这个时候怎么又来了个方法(method),函数和方法的区别是什么?
###function 和method的区别
可以说函数(function)是class,而method就是class中的一个函数(这个函数是指Java上的概念)。为啥呢,上面说了,各个function都是从Function继承过来的,那么每个function都有一个特定的method,这个method是啥呢,就是能体现这个function真正作用的method,比如上面的就是x+1,只不过被Function类用apply包装了。我们可以 想象成:
object myFunction extends Function1(){
    ...
    apply(x:Int):Int=x+1
    ...
}
那么val f=(x:Int)=>x+1其实就是val f=new myFunction()
所以f(1)=f.apply(1)
所以,结论就是,函数的概念是大于方法的,函数其实本质是class,他是包含了方法的。
所以在理解了Function其实是class后,能很好的理解函数为什么可以作为变量了,其实f就是这个Function的一个实例而已。
###关于Function与method的转换
method转为Function
定义了一个g方法,那么如何将方法转为函数呢
可以通过_来实现
val h=g _
这样h就成了一个实例了。
>关于下划线_的作用
  1. 作为“通配符”,类似Java中的*。如import scala.math._
  2. :_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
  3. 指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:a.filter(_%2==0).map(2*_)。
  又如要对缓冲数组ArrayBuffer b排序,可以这样:
  val bSorted = b.sorted(_
  4. 在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代。 
  5. 使用模式匹配可以用来获取元组的组员,例如
  val (first, second, third) = t
  但如果不是所有的部件都需要,那么可以在不需要的部件位置上使用_。比如上一例中val (first, second, _) = t
  6. 还有一点,下划线_代表的是某一类型的默认值。
  对于Int来说,它是0。
  对于Double来说,它是0.0
  对于引用类型,它是null。
  7.  用于将方法转换成函数,比如val f=sqrt _,以后直接调用f(250)就能求平方根了
 
##作为参数传递
定义了一个fun方法,里面的参数有两个一个是int型的x,一个是参数为int,返回值是int类型的函数f(感觉和C语言中的函数指针有点像)
那么如何往里面传值呢,其实这里传的还是一个变量,只是这个变量是Function的实例。上面分析了method可以转换为Function,所以这里至少有两种方法。
1. 直接传一个变量,比如val m=(x:Int)=>x+1
接着
2. 传一个方法(当然这个方法的参数和返回值需要满足上述条件)
接着
这个能成功运行,说明这里有一个隐性的转换机制。
 
>=>的作用
在Function中,表示将左边的转为右边的
val triple=(x:Double)=>3*x
将函数作为参数
def fun(f:(Double)=>Double)=f(0.25)
这里表示fun函数接受一个f函数作为参数,这里的f类型是(Double)=>Double表示输入为Double,输出为Double的函数
 

Scala中function的理解的更多相关文章

  1. javascript中 (function(){})();如何理解?

    javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...

  2. IIFE-js中(function(){…})()立即执行函数写法理解

    介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的 ...

  3. 转载:理解scala中的Symbol

    相信很多人和我一样,在刚接触Scala时,会觉得Symbol类型很奇怪,既然Scala中字符串都是不可变的,那么Symbol类型到底有什么作用呢? 简单来说,相比较于String类型,Symbol类型 ...

  4. Scala 中的函数式编程基础(一)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  5. scala中常用但其他语言不常见的符号含义

    本文旨在介绍Scala在其他语言中不太常见的符号含义,帮助理解Scala Code. 随着我对Scala学习的深入,我会不断增加该篇博文的内容. 修改记录 ----2016.11.23  新增scal ...

  6. Programming In Scala笔记-第七章、Scala中的控制结构

    所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...

  7. Scala教程之:深入理解协变和逆变

    文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个cla ...

  8. Scala中apply的用法

    Scala中的 apply 方法有着不同的含义, 对于函数来说该方法意味着调用function本身, 以下说明摘自Programming in Scala, 3rd Edition Every fun ...

  9. scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name

    假设Student类如下: class Student { private int no; private String name; public int getNo() { return no; } ...

随机推荐

  1. 【滚动数组】 dp poj 1036

    题意:一群匪徒要进入一个酒店.酒店的门有k+1个状态,每个匪徒的参数是:进入时间,符合的状态,携带的钱. 酒店的门刚开始状态0,问最多这个酒店能得到的钱数. 思路: dp数组为DP[T][K]. 转移 ...

  2. Anton and School

    Anton and School time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. C、C++、java的区别

    经常听到有人在抱怨这个语言哪里哪里 不好,那个语言又是如何的优秀.对于这样 的牢骚,我只是一笑而过. 就我而言,语言只是工具,没有好坏之 分.只要你采用相应的语言,完成对应的工 作,那你的目标就完成了 ...

  4. 【转载】GDI 映像方式 之 SetViewportOrgEx 与 SetWindowOrgEx 解析

    SetViewportOrgEx 与 SetWindowOrgEx 解析 这两个函数,用来改变视端口和窗口的原点,并都具有改变轴的效果,以致(0,0)不再指左上角. 「视端口」是依据设备坐标(图素)的 ...

  5. Hadoop学习笔记—5.自定义类型处理手机上网日志

    转载自http://www.cnblogs.com/edisonchou/p/4288737.html Hadoop学习笔记—5.自定义类型处理手机上网日志 一.测试数据:手机上网日志 1.1 关于这 ...

  6. Box2d b2World的RayCast方法

    RayCast方法: world.RayCast(callback:Function,point1:b2Vec2,point2:b2Vec2); * callback 回调函数 * point1 射线 ...

  7. J2SE基本数据结构

    1.J2SE中的常用数据结构对象的继承关系如下图 Collection ........|--------List ........|..........|----------ArrayList .. ...

  8. UVALive 6885 Flowery Trails

    两次SPFA #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...

  9. EnglishWords----1

    upon在...上面 upright垂直的,直立的 upward向上的 outward外面的,向外的 downward向下的 vertical垂直的 parallel平行的 sow播种 cut切 ch ...

  10. awk 数组排序-- asort 与 asorti

    两者排序区别: asort 是对数组的值进行排序,并且会丢掉原先键值: asorti是对数组的下标进行排序. 数据文件: 12 34 78 90 23 45 1. awk是关联数组.for-in循环输 ...