返回顶部

OutOfMemory.CN技术专栏-> Scala-> scala入门之函数,匿名函数,curried函数

scala入门之函数,匿名函数,curried函数

更多

我们知道scala是一个函数式和面向对象有机结合的语言,scala的函数式有很多意想不到的功能。

定义常规的scala add函数

def add (i:Int,j:Int):Int=i+j

这个函数太简单了,所以只有一行,连花括号都省略了,我们逐词分析这个函数

  1. def 是函数定义的关键字;
  2. add是函数名
  3. 小括号内的是参数列表,i:Int是此函数的第一个参数,该参数的名字是i类型是Int,注意scala是区分大小写的,只能是Int不能写成int;j:Int是第二个参数,参数之间用逗号分隔
  4. 参数列表之后是:Int,这表示此函数的返回值的类型,返回值的类型是可以省略的,注意如果返回值类型写成Unit表示void,即没有返回值,如果可以推断出返回值的类型,你也
  5. 然后是=,这个等号是函数体的开始
  6. i+j这里的i+j就是函数的返回值,scala不需要return,函数体的最后一个表达式就是函数的返回值

如果函数比较复杂,那么就不可能一行写完了,如果函数有多行的话,需要花括号将函数体包围起来,如下实例:

def addSayHelloFirst(i:Int,j:Int):Int={
     println("Hello")
     i+j
}

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");
  i+9
})

上述匿名函数都省略了参数的类型定义和返回值类型的定义,你也可以通过:Type的方式指定类型名。

scala函数特有特性之部分参数

在scala中可以指定函数的一部分参数,生成一个新的函数。我们还以add函数来做说明

def add(i:Int,j:Int)=i+j
val add2=add(2,_:Int)
add2(9)

上面三行代码说明如下

  1. 第一行定义了一个add函数,实现两个整形数字的相加
  2. 第二行是一个常量赋值语句,将add(2,_:Int)赋值给add2, 这里的_是一个参数占位符,add2的类型是函数
  3. 第三行调用了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

推荐阅读:
支持

1

反对

0

发表评论