scala 方法与函数

scala 方法与函数

定义方法

定义方法的基本格式是:
def 方法名称 (参数列表):返回值类型 = 方法体

def add(x:Int,y:Int):Int = x+y
	println(add(1,2))
//也可以定义成
//def add(x:Int,y:Int)=x+y
//或者
def add(x:Int,y:Int){x+y}
//没有返回值一定要用大括号那方法体括起来

带有参数列表的方法

def addThenMultiply(x:INt,y:Int)(multipier:Int):Int=(x+y)*multipier 
println(addThenMultiply(1,2)(3))

无参数方法

scala> def name:String = System.getProperty("user.name")
name: String

scala> name
res2: String = apple

scala> name()
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
              name()
                  ^

scala> def name():String = System.getProperty("user.name")
name: ()String

scala> name()
res4: String = apple

scala> name
res5: String = apple

方法体是多行语句的表达式

def getSquareString(input:Double):String = {
	val square =input*input
	square.toString
}

带有默认值的方法

默认参数,可以有多个。对位置不作要求

def method1(a:Int=1,b:Int,c:Int=3)=println("a="+a+"b= "+b+"c="+c)
//调用
method1(b=2) //不能method1(2)
//或者
method1(1,2)//method1(a=1,b=2)
//或则
method1(1,2,3) //method1(c=1,b=2,a=3)

可变参数或者不定长参数

注意1:(可变参数一定是参数列表的最后一个参数)
注意2:(函数内部,重复参数类型是声明参数类型的数组,但是如果给你一个可变参数的方法传一个数组,是会报编译错误 :type mismatch ,可以使用数组名:_*的方式传参)

def add(a:Int*)

{ 
for(i<-a) 
{ 
println(i); 
} 
}

调用:

add(1,2,3,4,5) 
或者: 
var arr = Array(1,2,3,4,5,8) 
add(arr:_*)

注意:

  1. 方法的返回值类型不可不写,编译器可以自动推断出来,但是对于递归函数,必须制定返回类型
  2. 方法的返回值默认是方法体中最后一行表达式的值,方然也可以用return来执行返回值,但不推荐这么做
  3. 若使用return来制定函数的返回值。scala的类型推断将会失效,要显式制定返回值类型
  4. 方法也可以没有返回值(返回值是Unit)

定义函数

给方法传递一个函数类型的参数:

def foo(f:Int => String) =...
def bar(f:(Boolean,Double)=>List[String]) = ...

函数可以看做是带有参数的表达式

  1. 函数定义的方式:
val f1 = ((a:Int,b:Int) =>a+b)
val f2 = (a:Int,b:Int) =>a+b
val f3 = (_:Int)+(_:Int)
val f4 :(Int,Int)=>Int = (_+_)
  1. 函数的定义方式:
val f1 : (Int,Int)=>Int=(x,y)=>x+y
val f2:((Int,Int)=>Int)={(x,y)=>x+y}
  1. 函数的定义方式
val f1 = new Function2[Int,Int,Int]{
def apply(x:Int,y:Int):Int = if(x<y)y else x
}
  1. 匿名函数
(x:Int)=>x+1
  1. 多参函数
val f1 = (x:Int,y:Int)=>x+y

//调用函数
f1(1,2)
  1. 无参函数
val getTheAnswer =()=>42
println(getTheAnswer())

方法和函数的区别

  • 方法和函数的定义的语法不同
  • 方法一般定义在某个类,特质,或者object中
  • 方法可以共享所在类内的属性

在函数式编程语言中,函数式”头等公民”,可以调用它,也可以传递它,存放在变量中,或者作为参数传递给另一个函数

案例:首先定义一个方法,然后将函数传递到方法limian

scala> def m(f:(Int,Int)=>Int) = f(2,6)
m: (f: (Int, Int) => Int)Int

scala> val f2 = (x:Int,y:Int)=>x-y
f2: (Int, Int) => Int = <function2>

m(f2)
res17: Int = -4

讲方法转换成函数

把方法作为参数传给一个方法或者函数的时候。方法被转换为函数
使用神奇的下划线_

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

scala> m1 _
res19: (Int, Int) => Int = <function2>

scala> m1(_,_)
res20: (Int, Int) => Int = <function2>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值