Scala -- 方法,函数

方法

一个类可以有自己的方法,scala中的方法和Java方法类似。但scala与Java定义方法的语法是不一样的。

定义方法

语法

def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
   // 方法体:一系列的代码
}

  1. 参数列表的参数类型不能省略
  2. 返回值类型可以省略,由scala编译器自动推断
  3. 返回值可以不写return,默认就是{}块表达式的值

示例

  1. 定义一个方法,实现两个整形数值相加,返回相加后的结果
  2. 调用该方法

参考代码

scala> def add(a:Int, b:Int) = a + b
m1: (x: Int, y: Int)Int
​
scala> add(1,2)
res10: Int = 3

返回值类型推断

scala定义方法可以省略返回值,由scala自动推断返回值类型。

定义递归方法,不能省略返回值类型

示例

定义递归方法(求阶乘)

10 * 9 * 8 * 7 * 6 * ... * 1

参考代码

scala> def m2(x:Int) = {

     | if(x<=1) 1

     | else m2(x-1) * x

     | }

<console>:13: error: recursive method m2 needs result type

       else m2(x-1) * x

方法参数

scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:

  • 默认参数
  • 带名参数
  • 变长参数

默认参数

在定义方法时可以给参数定义一个默认值。

参考代码

// x,y带有默认值为0

def add(x:Int = 0, y:Int = 0) = x + y

add()

带名参数

在调用方法时,可以指定参数的名称来进行调用。

参考代码

def add(x:Int = 0, y:Int = 0) = x + y

add(x=1)

变长参数

如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。

语法格式:

def 方法名(参数名:参数类型*):返回值类型 = {

    方法体

}

在参数类型后面加一个*号,表示参数可以是0个或者多个

参考代码

scala> def add(num:Int*) = num.sum

add: (num: Int*)Int



scala> add(1,2,3,4,5)

res1: Int = 15

方法调用方式

在scala中,有以下几种方法调用方式,

  • 后缀调用法
  • 中缀调用法
  • 花括号调用法
  • 无括号调用法

在后续编写spark、flink程序时,我们会使用到这些方法调用方式。

后缀调用法

这种方法与Java没有区别。

语法

对象名.方法名(参数)

示例

使用后缀法Math.abs求绝对值

参考代码

scala> Math.abs(-1)

res3: Int = 1

中缀调用法

语法 注意空格

对象名 方法名 参数

例如:1 to 10

如果有多个参数,使用括号括起来

示例

使用中缀法Math.abs求绝对值

scala> Math abs -1

res4: Int = 1

操作符即方法

scala中,+ - * / %等操作符都是方法,操作符是一个方法名字是符号的方法。

花括号调用法

语法

Math.abs{

    // 表达式1

    // 表达式2

}

方法只有一个参数,才能使用花括号调用法

示例

使用花括号调用法Math.abs求绝对值

参考代码

scala> Math.abs{-10}

res13: Int = 10

无括号调用法

如果方法没有参数,可以省略方法名后面的括号

示例

  1. 定义一个无参数的方法,打印"hello"
  2. 使用无括号调用法调用该方法

参考代码

def m3()=println("hello")

m3()

 

函数

scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数

定义函数

语法

val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体

  1. 函数是一个对象(变量)
  2. 类似于方法,函数也有输入参数和返回值
  3. 函数定义不需要使用def定义
  4. 无需指定返回值类型

参考代码

scala> val add = (x:Int, y:Int) => x + y

add: (Int, Int) => Int = <function2>



scala> add(1,2)

res3: Int = 3

方法和函数的区别

  1. 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
  2. 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
  3. 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有

示例

方法无法赋值给变量

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

add: (x: Int, y: Int)Int



scala> val a = add

<console>:14: error: missing arguments for method add;

follow this method with `_' if you want to treat it as a partially applied function

       val a = add

方法转换为函数

  • 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数
  • 使用_即可将方法转换为函数

参考代码

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

add: (x: Int, y: Int)Int



scala> val a = add  _

a: (Int, Int) => Int = <function2>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值