Scala 函数(二)

Scala 函数

Scala中要定义函数,需要给出函数的名称,参数和函数体
def function(x: Double)= if (x > 0 )x else 0

**必须给出所有参数的类型,不过只要函数不是递归的 ,可以不用指定返回值类型,Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
如果函数体需要多个表达式完成,可以用代码块,块中最后一个表达式的值就是函数的返回值
**

package function
/**
  * 函数默认值&带值参数 --> 函数默认值,在调用时传值则使用指定值,不传值则使用默认值
  * 默认值参数 --> 不写返回值自动推断
  * 可变长参数 --> 放在参数列表的最后一位
  * 递归函数--> 指定返回值类型
  */

object Function1 {

  def main(args:Array[String]): Unit = {
	// 标准格式
    // println(function1(1,2))
    // 自动推导返回值类型
    // println(function2(1,2))
    // 可以指定自参数
    // function3(b="Number= ",a = 1)

    // 默认值参数指定一个参数名
	//    function4(age = 19)
    // 对默认值参数进行修改
//    function4("李四",age = 19)


    // 可变长参数
//    val sum = function5("求和:",1,2,3,4,5 )
//    println(sum)


//    val jc1 = jc(5)
//    println(jc1)

  }

  // 递归调用需要给定返回值类型
  def jc(x:Int): Int={
    if(x >= 1){
      x * jc(x-1)
    }else{
      1
    }
  }

  // 可变长参 只能放到参数表最后一位
  def function5(str:String,y:Int*) ={
    var sum = 0;
      for(num <- y){
        sum += num
      }
    sum
  }
  
  // 默认值参数 不写返回值自动推断
  def function4(sex:String = "男",age:Int)={

    println(sex,age)

  }

  // 无返回值 指定参数
  def function3(a:Int,b:String): Unit= {
    print(b,a)
  }


  // 自动推导返回值类型
  def function2(x:Int ,y:Int) ={
    x * y
  }

  // def 方法名(方法参数):返回值类型={
  //     返回
  // }
  def function1(x:Int ,y:Int ):Int={
    x + y
  }

}

过程

Scala 对于不返回值的函数有reshuffle的表示法,如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit。这样的函数被承做过程(procedure)。过程不返回值

package function
object Function1 {

  def main(args:Array[String]): Unit = {
    function12(2,4)
  }

  def function12(x:Int ,y:Int) {
    println(x * y)
  }
}

匿名函数

没有函数名的函数,只有函数体

语法:`(arg1:类型,arg2:类型…) => 函数体

package function

/**
  * 匿名函数
  */
object Function2 {

  def main(args:Array[String]) :Unit={

    val demo = (x:Int,y:Int) => x + y

    var demo1 = () => "Hello World"

    println(demo(1,2))

    println(demo1())


    // 匿名函数 标准写法
    val f1:Function2[Int,Int,String] = (x:Int,y:Int) => x + "+"+ y + "="+  + (x + y)

    println(f1(3 ,5))

    // 简便写法

    val f2 = (x:Int,y:Int) => x + "+"+ y + "="+  + (x + y)

    println(f2)
  }
}

柯里化函数(Curring)

柯里化函数指将接受多个参数的函数,改造为接收单个参数的函数,并且返回一个函数对象的过程就称为柯里化

package function

/**
  * 柯里化 函数
  */
object Function03 {

  def main(args: Array[String]): Unit = {
    val demo1 = m2(1)
    println(demo1) // 返回一个 <function1> 对象
    println(demo1(2)) // 3

    val demo2 = m3(1)(_)
    println(demo2) // <function1>
    println(demo2(3)) // 4

    val demo3 = m3(1)(2)
    println(demo3) // 3

  }

  // 柯里化 将原来接收两个参数的函数 转为接收单个参数的函数,并且返回一个函数对象
  def method1(a:Int,b:Int)={
    a + b
  }

  // 柯里化标准写法
  //  def m2(x:Int) = (y:Int) => (z:Int) => x+y+z
  def m2(x:Int) = (y:Int) => x+y

  // 柯里化简便写法

  def m3(x:Int)(y:Int) = x + y

}

懒值lazy

当val被lazy声明时,他的初始化将被延迟,知道我们首次对他进行取值才会进行初始化

// 被lazy 声明
scala> lazy val a = 1 / 0
a: Int = <lazy>
// 首次访问的时候才会执行
scala> println(a)
java.lang.ArithmeticException: / by zero
  at .a$lzycompute(<console>:11)
  at .a(<console>:11)
  ... 32 elided
// 未被lazy修饰,声明的时候就会抛出异常
scala> val b = 1 / 0
java.lang.ArithmeticException: / by zero
  ... 32 elided
scala>

可以理解为懒值是介于 val 和 def 之间的状态
val 是声明的时候取值
lazy 首次访问的时候取值
def 每一次访问的时候都取值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值