在函数式语言中,函数是和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. Hidden Word

    Hidden Word time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  2. Spring Boot 系列教程16-数据国际化

    internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...

  3. bios自检时间长,显示0075错误

    一amibios主板,只有一IDE接口,接一硬盘一光驱,每次启动时,在bios自检界面,在检测完usb设备后,都要等个那么一两分钟,这个时候,可以在屏幕的右下角看到有数字:0075 ,这就是错误代码. ...

  4. iOS label换行 自适应

    //自动折行设置 addressDetailLab.lineBreakMode = NSLineBreakByWordWrapping; addressDetailLab.numberOfLines ...

  5. UIKit控件直接显示网页文字内容

    NSString *html = @"<bold>Hello</bold> Now<br> <em>iOS</em> can cr ...

  6. Android.mk与jni目录的关系

    附1: Android.mk与jni目录的关系: 在某目录下,如/src/modules1/下存放Android.mk和Application.mk,调用ndk-build试图编译时,会遇到如下错误: ...

  7. HDU1102--Constructing Roads(最小生成树)

    Problem Description There are N villages, which are numbered from 1 to N, and you should build some ...

  8. Windows编译安装mod_wsgi,配合使用Django+Apahce

    编译环境: 均是32位版本 Microsoft Visual Studio 10.0 Microsoft SDKs v7.1 Apache2.4 Python3.4 mod_wsgi-4.5.0 要求 ...

  9. Git学习 -- 自定义Git

    忽略特殊文件 在工作区创建.gitignore文件,编写内容 # Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: 忽略Python编译产生的. ...

  10. ORACLE中CHAR、VARCHAR、NVARCHAR

    1. char      固定长度,最长n个字符.   2. varchar      最大长度为n的可变字符串. (n为某一整数,不同数据库,最大长度n不同)   char和varchar区别:   ...