首页 技术 正文
技术 2022年11月20日
0 收藏 613 点赞 4,265 浏览 1780 个字

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

##作为变量val f=(x:Int)=>x+1为啥可以这样写?由于scala是OOP,所以function也是个object。各个function都是继承了Function类,比如Function1类表示参数是1的function类。 Scala中function的理解Scala中function的理解Scala中function的理解Scala中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转为FunctionScala中function的理解Scala中function的理解定义了一个g方法,那么如何将方法转为函数呢可以通过_来实现val h=g _Scala中function的理解Scala中function的理解这样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)就能求平方根了 ##作为参数传递Scala中function的理解Scala中function的理解定义了一个fun方法,里面的参数有两个一个是int型的x,一个是参数为int,返回值是int类型的函数f(感觉和C语言中的函数指针有点像)那么如何往里面传值呢,其实这里传的还是一个变量,只是这个变量是Function的实例。上面分析了method可以转换为Function,所以这里至少有两种方法。1. 直接传一个变量,比如val m=(x:Int)=>x+1Scala中function的理解Scala中function的理解接着Scala中function的理解Scala中function的理解2. 传一个方法(当然这个方法的参数和返回值需要满足上述条件)Scala中function的理解Scala中function的理解接着Scala中function的理解Scala中function的理解这个能成功运行,说明这里有一个隐性的转换机制。 >=>的作用在Function中,表示将左边的转为右边的val triple=(x:Double)=>3*x将函数作为参数def fun(f:(Double)=>Double)=f(0.25)这里表示fun函数接受一个f函数作为参数,这里的f类型是(Double)=>Double表示输入为Double,输出为Double的函数 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,910
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,435
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,250
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,061
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,693
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,731