《Scala cookBook》Chapter 9

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/80344464

《Scala cookBook》Chapter 9

1.定义函数:
//常见错误1:定义函数时,只出现了参数类型:(Int,Int),而没有出现具体的参数名
scala> def sum(Int,Int):Int={x+y}
<console>:1: error: ':' expected but ',' found.
def sum(Int,Int):Int={x+y}
           ^
//修正如下:
scala> def sum(x:Int,y:Int):Int={x+y}
sum: (x: Int, y: Int)Int

解读:
其实这个与Java中的函数定义几乎相同:

  • 函数需要参数,这里就是(x:Int,y:Int)
  • 函数需要返回类型,这里就是Int,参数和返回类型之间用:隔开
  • =后面接着就是整个方法体

因为方法体中只有一行代码,所以可以省略花括号,如下:

scala> def sum(x:Int,y:Int):Int=x+y
sum: (x: Int, y: Int)Int

又因为scala中具有很强的类型判断功能,所以又可以省略返回值类型,直接写成如下形式:

scala> def sum(x:Int,y:Int)=x+y
sum: (x: Int, y: Int)Int
2.定义一个函数字变量:

什么是函数字面量?
就是定义一个函数,但是将这个函数赋值给一个变量。即称函数字面量:
函数字面量的定义与单纯的函数定义有所不同,如下代码所示:

//创建语法如下:
//val [variableName]:(parameterType)=>ReturnType = (parameter:ParameterType) => {code body...}
scala> val f:(Int)=>Int =(i:Int)=>{i*2}
f: Int => Int = <function1>

因为方法体只有一行代码,所以可以不使用花括号,简化如下:

scala> val f:(Int)=>Int = (i:Int)=>i*2
f: Int => Int = <function1>

因为函数参数只有一个,所以可以省略参数类型的括号,简化如下:

scala> val f:Int=>Int =(i:Int)=>i*2
f: Int => Int = <function1>

因为可以从i*2中推断出i是一个Int型,所以省略Int,简化如下:

scala> val f:Int=>Int = i=>i*2
f: Int => Int = <function1>

因为在scala中可以使用_表示占位符,所以用_替代i,简化如下:

scala> val f:Int=>Int = _*2
f: Int => Int = <function1>

最后再次简化!

scala> val f = (i:Int)=>i*2//只能省略一个参数类型,不能两个全省!返回值类型可以自动推断
f: Int => Int = <function1>

3.定义一个函数【使用def关键字】

scala> def modMethod(i:Int):Boolean = {i%2 ==0}
modMethod: (i: Int)Boolean

去返回值Boolean【可自动推断】

scala> def modMethod(i:Int) = {i%2 ==0}
modMethod: (i: Int)Boolean

去方法体中的大括号【方法体只有一行代码】

scala> def modMethod(i:Int) = i%2 ==0
modMethod: (i: Int)Boolean
#没有参数,且返回值类型为Unit
scala> val sayHello:()=>Unit = () =>println("Hello")
sayHello: () => Unit = <function0>

#如果没有参数,可以直接忽略(),同时返回值类型可推断
scala> val sayHello = () =>println("Hello")
sayHello: () => Unit = <function0>

scala> def executeXTimes(callback:()=>Unit,numTimes:Int){
     | for(i <- 1 to numTimes) callback()
     | }
executeXTimes: (callback: () => Unit, numTimes: Int)Unit

scala> executeXTimes(sayHello,2)
Hello
Hello

定义一个方法,并将一个函数作为其方法的参数之一。

#参数有两个,一个是函数callback,一个是Int型变量y
scala> def executeAndPrintSum(callback:(Int,Int)=>Unit,x:Int,y:Int){
     | val result = callback(x,y)
     | println(result)
     | }
executeAndPrintSum: (callback: (Int, Int) => Unit, x: Int, y: Int)Unit

#定义一个函数字面量
scala> val sum:(Int,Int)=>Unit = (x:Int,y:Int)=>x+y
sum: (Int, Int) => Unit = <function2>

#没有结果的原因是:我们将函数字面量sum定义成了返回值为Unit的类型
scala> executeAndPrintSum(sum,1,2)
()

scala> sum(1,2)

重新定义一个sum1,接受两个输入参数,返回值类型为Int

scala> val sum1:(Int,Int)=>Int = (x:Int,y:Int)=>x+y
sum1: (Int, Int) => Int = <function2>

scala> sum1(1,2)
res14: Int = 3

#因为executeAndPrintSum中的函数参数是没有返回值,但是我们传递进去的sum1却是有返回类型【Int】
scala> executeAndPrintSum(sum1,1,2)
<console>:15: error: type mismatch;
 found   : (Int, Int) => Int
 required: (Int, Int) => Unit
       executeAndPrintSum(sum1,1,2)
                          ^
阅读更多

扫码向博主提问

LittleLawson

做一名真诚正直优秀的科技人员。
  • 擅长领域:
  • Kafka
  • Spark
  • Hadoop
  • Java
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页