Scala——傻傻分不清的方法和函数

1、认识

感性的认识一下方法和函数
在这里插入图片描述
方法m 是一个逻辑操作快;
函数f 是对象,可以赋值给一个变量或常量;
函数f 有一个=>转换符号;

2、区分

2-1、函数可作为一个参数传入到方法中,而方法不行。

方法m 方法名即是方法调用,有参数需带参数;
函数f 函数名是函数对象本身,是实现了Function特质的对象,调用需要调apply方法即"()";

object MethodAndFunctionDemo {
  //定义一个方法
  //方法 m1 参数要求是一个函数,函数的参数必须是两个Int类型
  //返回值类型也是Int类型
  def m1(f:(Int,Int) => Int) : Int = {
    f(2,6)
  }
  //定义一个函数f1,参数是两个Int类型,返回值是一个Int类型
  val f1 = (x:Int,y:Int) => x + y
  //再定义一个函数f2
  val f2 = (m:Int,n:Int) => m * n
  //main方法
  def main(args: Array[String]): Unit = {
    //调用m1方法,并传入f1函数
    val r1 = m1(f1)
    println(r1)
    //调用m1方法,并传入f2函数
    val r2 = m1(f2)
    println(r2)
  }
}

运行结果:

8
12

2-2、在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。

带参数列表的方法m 不能作为单独的表达式而存在,参数为空的除外;
函数f 可以;
有两种方法可以将方法转换成函数:

val f1 = m _

在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译器需要将方法转换成函数:

val f1: (Int) => Int = m

通常情况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。

object TestMap {
  def ttt(f:Int => Int):Unit = {
    val r = f(10)
    println(r)
  }
  val f0 = (x : Int) => x * x
  //定义了一个方法
  def m0(x:Int) : Int = {
    //传递进来的参数乘以10
    x * 10
  }
  //将方法转换成函数,利用了神奇的下滑线
  val f1 = m0 _
  def main(args: Array[String]): Unit = {
    ttt(f0)
    //通过m0 _将方法转化成函数
    ttt(m0 _);
    //如果直接传递的是方法名称,scala相当于是把方法转成了函数
    ttt(m0)
    //通过x => m0(x)的方式将方法转化成函数,这个函数是一个匿名函数,等价:(x:Int) => m0(x)
    ttt(x => m0(x))
  }
}

输出结果为:

100
100
100
100

2-3、函数必须要有参数列表,而方法可以没有参数列表

方法m 可以没有参数列表;
函数f 必须有;
在这里插入图片描述

2-4、在函数出现的地方我们可以提供一个方法

在需要函数的地方或者说指定类型为函数的地方,传入一个方法m,会自动转成函数f;
例如:把一个方法赋值给一个变量或常量,如果没有指定变量的类型是函数,则会报错,所以需要指定变量类型为函数才会自动转换方法为函数;或者过m _强制转换方法为函数。
在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)在这里插入图片描述
如果我们直接把一个方法赋值给变量会报错。如果我们指定变量的类型就是函数,那么就可以通过编译,如下:
在这里插入图片描述
当然我们也可以强制把一个方法转换给函数,这就用到了 scala 中的部分应用函数:
在这里插入图片描述

2-5、传名参数本质上是个方法

在这里插入图片描述
上图方法m1的参数就是传名参数(方法),由于对于参数为空的方法来说,方法名就是方法调用,那么List(x,x)就是是进行了两次方法x调用。

3、熄灯

方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。

函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号带上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。

参考:
Scala 方法和函数的区别
Scala method(方法) 和 functio(函数) 的区别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小技工丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值