在函数式语言中,函数是和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. 【dfs 回溯】 zoj 1004

    题意:给出一个源字符串和一个目标字符串,打出所有符合stack操作的i,o串使得对于源字符串的操作能变为目标字符串 思路:搜索,回溯. 之前想过是不是队列,觉得不对那样bfs是求最优解了:也想过用结构 ...

  2. 从拉动APP下载谈运营

    声明:这篇文章是前京东产品运营刘玮东的作品,我转过来主要方便以后自己温故,也怕这样的好文给漏或者找不到了. 当时面临的新课题就是如何用H5拉动APP的下载,背景是我们的渠道和发动传播的第一波用户不够多 ...

  3. Tomcat服务器

    常见的web服务器 1. WebLogic是BEA公司的产品,是目前应用最广泛的web服务器,支持J2EE规范(J2EE里有13种技术),商业产品,收费的.银行,证券等对并发,安全要求高的时候用,一般 ...

  4. Moya 浅析

    Moya是一个高度抽象的网络库,他的理念是让你不用关心网络请求的底层的实现细节,只用定义你关心的业务.且Moya采用桥接和组合来进行封装(默认桥接了Alamofire),使得Moya非常好扩展,让你不 ...

  5. Monad / Functor / Applicative 浅析

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  6. NSAttributedString 的21种属性 详解

    原文链接:http://www.jianshu.com/p/09f54730feaa 先看看所有的Key NSFontAttributeName; //字体,value是UIFont对象 NSPara ...

  7. java 持有对象

    1.泛型和类型安全的容器 ArrayList,可以自动扩充大小的数组,add插入对象,get访问对象,size查看对象数目. 1 /** 2 * 泛型和类型安全的容器 3 * 2016/5/6 4 * ...

  8. [转]程序开发基础学习二(C++ Google Style 命名规则)

    无规矩不成方圆,新的岗位就需要服从团队的编码规则.很开心团队用的是Google的C++编码规则,大概看了下Google 的编码规则,正如九天翔雁说的:“Google的 C++ Style Guide远 ...

  9. gcc编译错误表

    conversion from %s to %s not supported by iconv”iconv 不支持从 %s 到 %s 的转换” iconv_open”iconv_open” no ic ...

  10. C++文件编程(文件流操作)

    给出了比较常见的文件操作,包括二进制文件操作.代码如下: #include<iostream> #include<cstdio> #include<cstring> ...