欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scala 方法与函数

程序员文章站 2022-03-04 14:01:45
...

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>
相关标签: scala