Scala函数

函数声明
def funtionName([参数列表]):[return type]
标准函数
def sum01(x:Int,y:Int):Int={
    return x+y
  }
//可以尝试省略返回值类型
def sum02(x:Int,y:Int)={
    x+y
  }

可以省略return关键字以及返回值类型,系统一般可以自动推断。将代码块最后一行作为返回值。

可变长参数
def sum03(x:Int*)={
   var res=0
   for(i <- x){
     res += i
   }
   res
 }

def sum03(x:Int*)={
    x.sum
  }

注意:可变长参数必须放置在最后

命名参数
def main(args: Array[String]): Unit = {
      //print("hello!\n" * 10)
      saySomething(name="zhangsan",welcome = "welcome")
  }
def saySomething(welcome:String,name:String): Unit ={
    println(welcome+" ! "+name)
  }

可以不按照函数中参数的顺序

参数默认值
def main(args: Array[String]): Unit = {
      sayHello("ww")
      sayHello()
  }
def sayHello(name:String="zhangsan")={
    println(s"hi~~ $name")
  }
内嵌函数
def factorial(x:Int):Int={
    def mulit(i:Int):Int={
      if(x>0){
        x*mulit(x-1)
      }else{
        1
      }
    }
    mulit(x)
  }
柯里化(Currying)

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接收一个单一参数的函数,并且返回新的函数的技术。

def sum01(x:Int,y:Int):Int={
    return x+y
  }
  
  def sumCurrying(x:Int)(y:Int):Int={
    x+y
  }
scala> def sumCurrying(x:Int)(y:Int):Int={
     |     x+y
     |   }
sumCurrying: (x: Int)(y: Int)Int

scala> sumCurrying(2)(3)
res0: Int = 5

scala> var s=sumCurrying(1)(_)
s: Int => Int = <function1>

scala> s(2)
res4: Int = 3

scala> var s2=sumCurrying _
s2: Int => (Int => Int) = <function1>

scala> s2(2)(3)
res5: Int = 5
匿名函数|方法

只有参数列表和返回值类型,没有方法名,通常使用匿名函数形式去声明一个函数式变量 。 表面是变量,实质上还是函数。可以实现数据不动,代码动。

scala> var sum=(x:Int,y:Int)=>(x+y)
sum: (Int, Int) => Int = <function2>

scala> var mutil=(x:Int,y:Int)=>(x*y)
mutil: (Int, Int) => Int = <function2>

scala> println(sum(1,2)+"|"+mutil(1,2))
3|2

def关键字可以定义一个函数式变量。也可以声明一个标准方法。

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

通过上述变换可以推导出函数可以变换为变量,因此可以使用var或者val修饰函数式变量,函数式变量是函数,所以可以用del修饰。

def method(op:(Int,Int)=>Int)(x:Int,y:Int)={
    op(x,y)
  }
  val result01 = method((x,y)=>x+y)(1,2)
  val result02 = method((x,y)=>x*y)(1,2)
scala> def method(x:Int,y:Int,f:(Int,Int)=>Int):Int={
     |     f(x,y)
     |   }
method: (x: Int, y: Int, f: (Int, Int) => Int)Int

scala> var f=(x:Int,y:Int)=>(x+y)
f: (Int, Int) => Int = <function2>

scala> method(2,3,f)
res17: Int = 5


scala> var f=(x:Int,y:Int)=>(x*y)
f: (Int, Int) => Int = <function2>

scala> method(2,3,f)
res18: Int = 6
scala> var r=method(2,3,_:(Int,Int)=>Int)
r: ((Int, Int) => Int) => Int = <function1>

scala> r((x,y)=>x+y)
res20: Int = 5
def method(name:String,x:Int,y:Int,f:(String,Int,Int)=>String):String={
     |     f(name,x,y)
     |   }
scala> var f=(name:String,x:Int,y:Int)=>name+x+y
f: (String, Int, Int) => String = <function3>

scala> method("zhangsan",3,4,f)
res25: String = zhangsan34
scala> def method(name:String="lisi",x:Int,y:Int,f:(String,Int,Int)=>String):String={
     |     f(name,x,y)
     |   }
method: (name: String, x: Int, y: Int, f: (String, Int, Int) => String)String

scala> method("zhangsan",3,4,f)
res26: String = zhangsan34
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值