方法def 与 函数 细则
源码链接:https://pan.baidu.com/s/1psmnL2keRW_N781Cn-kBzg
提取码:ce34
★ Scala ★——方法def 与 函数 细则,99乘法表案例实现
★ Scala ★——继承、方法重写、抽象类、匿名类大全细则
- 目标:
- 掌握方法的格式和用法
- 掌握函数的格式和用法
- 掌握九九乘法表案例
1. 方法
1.1 概述方法格式
def 方法名(参数名:参数类型, 参数名:参数类型) : [return type] = {
方法体
}
注意:
- 参数列表的参数类型不能省略 ;
- 返回值类型可以省略,由scala编译器自动推断 ;
- 返回值可以不写return,默认就是{}块表达式的值。
- 示例:
- 定义一个方法getMax,用来获取两个整型数字的最大值, 并返回结果(最大值).
- 调用该方法获取最大值, 并将结果打印到控制台上
package Test
object ClassDemo1 {
def main(args: Array[String]): Unit = {
val max1 = getMax1(20,30)
println("max1最大值:"+max1)
val max2 = getMax2(6,4)
print("max2最大值:"+max2)
}
// 1.标准方法
def getMax1(a:Int, b:Int): Int = {
return if(a > b) a else b
}
// 2.优雅方法
def getMax2(a:Int, b:Int) = if(a > b) a else b // 推断出是Int类型
}
注意: 定义递归方法,不能省略返回值类型
- 示例递归方法,求阶乘
- 定义方法factorial, 用来计算某个数字的阶乘规律: 1的阶乘等于1, 其他数字的阶乘为:
n! = n * (n - 1)!
- 调用方法, 获取num阶乘, 并将结果打印到控制台上。
package Test
import scala.io.StdIn
object ClassDemo2 {
def main(args: Array[String]): Unit = {
println("please input num:")
val num = StdIn.readInt()
val f = factorial(num)
println(s"${num}的阶乘为:"+f)
}
// 求阶乘
def factorial(n:Int):Int = if (n==1) 1 else n * factorial(n-1)
}
1.2 方法参数
scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:
- 默认参数,在定义方法时可以给参数定义一个默认值。
- 带名参数,在调用方法时,可以指定参数的名称来进行调用。
- 变长参数,如果方法的参数是不固定的,可以将该方法的参数定义成变长参数。
格式: def 方法名(参数名:参数类型*): 返回值类型 = { //方法体 }
- 注意:
- 在参数类型后面加一个 * 号,表示参数可以是0个或者多个;
- 一个方法有且只能有一个变长参数, 并且变长参数要放到参数列表的最后边。
- 示例
package Test
object ClassDemo3 {
def main(args: Array[String]): Unit = {
val sum1 = getSum1()
println("默认参数: "+ sum1)
val sum2 = getSum1(a=1, b=7)
println("a=1, b=7 带名参数: "+ sum2)
val sum3 = getSum2(1,3,5,7,8)
println("变长参数累计求和: "+sum3)
}
def getSum1(a:Int = 11, b:Int = 22) = a + b
// 变长参数,累计求和
def getSum2(a:Int*) = a.sum
}
2. 函数
scala支持函数式编程,将来编写Spark/Flink程序会大量使用到函数
2.1 定义函数
val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体
注意:
- 在Scala中, 函数是一个对象(变量)
- 类似于方法,函数也有参数列表和返回值
- 函数定义不需要使用
def
定义- 无需指定返回值类型
- 示例
package Test
object ClassDemo4{
def main(args: Array[String]): Unit = {
// 1. 定义一个用来计算两个整数和的函数, 并将其赋值给变量sum
val getSum = (x:Int, y:Int) => x + y
// 2. 调用函数.
val result = getSum(10,2)
// 3. 打印结果
println("result: " + result)
}
}
2.2 方法和函数的区别
在Java中, 方法和函数之间没有任何区别, 只是叫法不同。
但是在Scala中, 函数和方法就有区别了, 具体如下:
- 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中;
- 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中;
- 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法;方法则没有。
结论: 在Scala中, 函数是对象, 而方法是属于对象的, 所以可以理解为: 方法归属于函数;而且方法无法赋值给变量。
遇到上面的问题,我们可以把方法转换为函数
2.3 方法转换为函数
有时候需要将方法转换为函数. 例如: 作为变量传递,就需要将方法转换为函数。
val 变量名 = 方法名 _ //格式为: 方法名 + 空格 + 下划线
注意: 使用 _ 即可将方法转换为函数
- 示例:对比 2.1 定义函数的代码
package Test
object ClassDemo5 {
def main(args: Array[String]): Unit = {
//1. 定义一个方法用来计算两个整数和
def add(x:Int, y:Int)= x + y
//2. 将该方法转换为一个函数,并赋值给变量
val sum = add _
// 3. 调用函数, 用来获取两个整数的和.
val result = sum(100, 2)
//4. 打印结果
println("result: " + result)
}
}
3. 方法、函数实现99乘法表
3.1 需求
定义方法、函数实现根据用户录入的整数, 打印对应的乘法表。
3.2 目的
- 考察键盘录入和方法、函数 的综合运用.
- 体会方法和函数的不同.
3.3 步骤
- 定义方法(或者函数), 接收一个整型参数;
- 通过for循环嵌套实现, 根据传入的整数, 打印对应的乘法表;
- 调用方法(函数), 输出结果。
package Test
import scala.io.StdIn
object ClassDemo6 {
def main(args: Array[String]): Unit = {
println("请输入一个整数:")
val num1 = StdIn.readInt()
Mtable(num1) // 调用方法
println("--"*25)
M_T(num1) // 调用函数
}
// 用方法实现99乘法表
def Mtable(n:Int) = {
for(i <- 1 to n; j <- 1 to i){
print(s"${i} * ${j} = ${i*j}\t")
if(j==i) println()
}
}
// 函数实现99乘法表
var M_T = (n:Int) => {
for(i <- 1 to n; j <- 1 to i){
print(s"${i} * ${j} = ${i*j}\t")
if(j==i) println()
}
}
}