scala implicit 参数函数参数带是什么意思

scala入门之函数,匿名函数,curried函数 - 为程序员服务
为程序员服务
scala入门之函数,匿名函数,curried函数
我们知道scala是一个函数式和面向对象有机结合的语言,scala的函数式有很多意想不到的功能。
定义常规的scala add函数
def add (i:Int,j:Int):Int=i+j
这个函数太简单了,所以只有一行,连花括号都省略了,我们逐词分析这个函数
def 是函数定义的关键字;
add是函数名
小括号内的是参数列表,i:Int是此函数的第一个参数,该参数的名字是i类型是Int,注意scala是区分大小写的,只能是Int不能写成int;j:Int是第二个参数,参数之间用逗号分隔
参数列表之后是:Int,这表示此函数的返回值的类型,返回值的类型是可以省略的,注意如果返回值类型写成Unit表示void,即没有返回值,如果可以推断出返回值的类型,你也
然后是=,这个等号是函数体的开始
i+j这里的i+j就是函数的返回值,scala不需要return,函数体的最后一个表达式就是函数的返回值
如果函数比较复杂,那么就不可能一行写完了,如果函数有多行的话,需要花括号将函数体包围起来,如下实例:
def addSayHelloFirst(i:Int,j:Int):Int={
& & &println("Hello")
scala的匿名函数
scala的匿名函数使用非常的广泛,这也是函数式语言的标志之一。
scala中的集合类List有一个map方法,该方法接收一个函数作为参数,对List中的每一个元素使用参数指定的方法,此处非常适合用匿名函数,请看下面代码:
val l=List(1,2,3)
l.map(i=&i+9)
上面代码的第二行map函数的参数就是一个匿名函数,或者是lambda表达式。
i=&i+9中的=&是参数列表和返回值的分隔符,如果少于两个参数可以不写小括号,后面部分是函数的返回值。如果函数体包含多行代码可以使用花括号,例如:
l.map((i)=&{
& println("HI");
上述匿名函数都省略了参数的类型定义和返回值类型的定义,你也可以通过:Type的方式指定类型名。
scala函数特有特性之部分参数
在scala中可以指定函数的一部分参数,生成一个新的函数。我们还以add函数来做说明
def add(i:Int,j:Int)=i+j
val add2=add(2,_:Int)
上面三行代码说明如下
第一行定义了一个add函数,实现两个整形数字的相加
第二行是一个常量赋值语句,将add(2,_:Int)赋值给add2, 这里的_是一个参数占位符,add2的类型是函数
第三行调用了add2函数
上面函数将输出11
scala函数特有特性之调配curried
我们定义一个devide函数实现除法,如下代码:
def devide(i:Int)(j:Int):Int=i/j
这个函数和上面的函数不同之处在于它的参数列表,是一个参数一个小括号,不是把所有参数都放到一个括号内的。下面我们通过实际的例子来理解scala的curried,函数调配。
下面我们要定义一个固定除以2的函数
val devideBy2=devide(_:Int)(2)
这个函数是一个常量,它使用了我们上面定义的devide函数,第一个参数是_:Int这里的下划线是个占位符,表示这个参数是变化的,另一个参数是固定的2。我们可以通过devideBy2(10)来调用上述函数,将返回5
类似的,我们也可以指定被除数,让除数做参数:
val _100Devide=devide(100)(_:Int)
_100Devide(10)
这就是scala的函数了。curried不太好理解,enjoy it
推荐阅读:
相关聚客文章scala入门-10 隐式转换、隐式参数、隐式类
到目前为止,隐式转换是scala的重点和难点了,加油~
我们先创建一个类名称叫Implicit.scala
再看一个隐式参数的例子:
上面的例子中使用了隐式参数,我们也可以明显的指明参数:
下面看一下隐式类:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Scala开发教程(26): 柯里化函数 - 推酷
Scala开发教程(26): 柯里化函数
前面我们说过,Scala允许程序员自己新创建一些控制结构,并且可以使得这些控制结构在语法看起来和Scala内置的控制结构一样,在Scala中需要借助于
,柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
下面先给出一个普通的非柯里化的函数定义,实现一个加法函数:
scala& def plainOldSum(x:Int,y:Int) = x + y
plainOldSum: (x: Int, y: Int)Int
scala& plainOldSum(1,2)
res0: Int = 3
下面在使用“柯里化”技术来定义这个加法函数,原来函数使用一个参数列表,“柯里化”把函数定义为多个参数列表:
scala& def curriedSum(x:Int)(y:Int) = x + y
curriedSum: (x: Int)(y: Int)Int
scala& curriedSum (1)(2)
res0: Int = 3
当你调用curriedSum (1)(2)时,实际上是依次调用两个普通函数(非柯里化函数),第一次调用使用一个参数x,返回一个函数类型的值,第二次使用参数y调用这个函数类型的值,我们使用下面两个分开的定义在模拟curriedSum柯里化函数:
首先定义第一个函数:
scala& def first(x:Int) = (y:Int) =& x + y
first: (x: Int)Int =& Int
然后我们使用参数1调用这个函数来生成第二个函数(回忆前面定义的闭包)。
scala& val second=first(1)
second: Int =& Int = &function1&
scala& second(2)
res1: Int = 3
first,second的定义演示了柯里化函数的调用过程,它们本身和curriedSum 没有任何关系,但是我们可以使用curriedSum 来定义second,如下:
scala& val onePlus = curriedSum(1)_
onePlus: Int =& Int = &function1&
下划线“_” 作为第二参数列表的占位符, 这个定义的返回值为一个函数,当调用时会给调用的参数加一。
scala& onePlus(2)
res2: Int = 3
通过柯里化,你还可以定义多个类似onePlus的函数,比如twoPlus
scala& val twoPlus = curriedSum(2) _
twoPlus: Int =& Int = &function1&
scala& twoPlus(2)
res3: Int = 4
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致Scala 教程
Scala 函数 - 默认参数值
Scala 可以为函数参数指定默认参数值,使用了默认参数,你在调用函数的过程中可以不需要传递参数,这时函数就会调用它的默认参数值,如果传递了参数,则传递值会取代默认值。实例如下:
object Test {
def main(args: Array[String]) {
println( "返回值 : " + addInt() );
def addInt( a:Int=5, b:Int=7 ) : Int = {
var sum:Int = 0
sum = a + b
return sum
执行以上代码,输出结果为:
$ scalac Test.scala
$ scala Test
返回值 : 12

我要回帖

更多关于 scala map函数参数 的文章

 

随机推荐