方法-函数
方法
def 方法名(参数名1:参数类型1,参数名2:参数类型2):返回值类型 = {方法体}
- Scala之后的方法和Java中的方法一样,都可以用来将一些操作进行封装,
- 如接收一些参数, 根据这些参数执行封装好的代码, 并将执行结果进行返回(如果有就返回)
入门案例
hanjiaxiaozhipackage cn.hanjiaxiaozhi.basic2
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 15:17
* Desc
*/
object _01_MethodDemo {
//main方法
def main(args: Array[String]): Unit = {
val res: Int = sum(1, 10)
println(res) // 55
val res2: Int = sum(1, 100)
println(res2) // 5050
}
//定义一个方法,完成从n~m的累加和
//方法的定义格式:
//def 方法名(参数名1:参数类型1,参数名2:参数类型2):返回值类型 = {方法体}
def sum(n: Int, m: Int): Int = {
var result: Int = 0
for (i <- n to m) {
result += i
}
result //for循环执行完,result中存的就是n~m的累加和,将result返回
}
}
方法定义的细节
- 1.方法的
返回值类型和return可以不写
,编译器可以自动推断出来 - 2.对于
递归方法,必须指定返回类型
- 3.如果
方法没有返回值,返回Unit类型
(类似于void,也可以不写) - 4.返回值类型
有多种情况则返回Any
- 5.带有默认值参数的方法,调用时,
可以给定新值,也可以使用默认值
- 6.
可以通过参数名来指定传递给哪一个参数
,这样传递参数时就可以不按照顺序传递 - 7.方法没有参数,调用时可以省略(),
如果定义时()省略,调用时则必须省略
- 8.
可变参使用 变量名:类型*
(类似Java的…)
package cn.hanjiaxiaozhi.basic2
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 15:17
* Desc 演示方法定义的细节
*/
object _02_MethodDemo2 {
//main方法
def main(args: Array[String]): Unit = {
method3("jack") //jack 默认的msg为sucess
method3("jack", "hello") //jack hello
method4(1, 10) //a=1, b=10
method4(a = 1, b = 10) //a=1, b=10
method4(b = 10, a = 1) //a=1, b=10
method5() //方法参数,调用时可以有(),也可以省略
method5
//method6()//但是如果方法没有参数,定义的时候省略的(),那么调用的时候必须省略,不能加
method6
println(getSum(1,2)) //3
println(getSum(1,2,3,4,5)) //15
}
//1.方法的返回值类型和return可以不写,编译器可以自动推断出来
def add(x: Int, y: Int) = {
x + y
}
//2.对于递归方法,必须指定返回类型,不可省略
//使用递归求阶乘,如求10! = 10 * 9 * 8 * .... *2 * 1 = 10 * 9! = 10 * 9 * 8!.......
def getFactorial(n: Int): Int = {
if (n <= 0) {
1
} else {
n * getFactorial(n - 1)
}
}
//3.如果方法没有返回值,返回Unit类型(类似于void,也可以不写)
def method1(msg: String): Unit = {
println(msg)
}
//4.返回值类型有多种情况则返回Any,或者不写
def method2(age: Int): Any = {
if (age >= 18) {
"ok"
} else {
0
}
}
//5.带有默认值参数的方法,调用时,可以给定新值,也可以使用默认值 ---有点类似python语法
def method3(name: String, msg: String = "默认的msg为sucess"): Unit = {
println(name + " " + msg)
}
//6.可以通过参数名来指定传递给哪一个参数,这样传递参数时就可以不按照顺序传递
def method4(a: Int, b: Int) = {
println("a=" + a)
println("b=" + b)
}
//7.方法没有参数,调用时可以省略(),如果定义时()省略,调用时则必须省略
def method5() = {
println("method5")
}
def method6 = {
println("method6")
}
//8.可变参使用 变量名:类型* (类似Java的...表示可变参数) ---和python中的语法也类似
def getSum(args: Int*) = { //Int*表示可以接收多个Int值,也就是可以组成一个Int数组
var result = 0
for (i <- args) {
result += i
}
result
}
}
- 补充Java中的可变参数
package cn.hanjiaxiaozhi.basic2;
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 15:46
* Desc 演示Java可变参
*/
public class VaribaleDemo {
public static void main(String[] args) {
System.out.println(getSum(1));//1
System.out.println(getSum(1, 2));//3
System.out.println(getSum(1,2,3,4,5));//15
}
public static int getSum(int... args){//int...args表示可以传递多个int值,给args组成一个int数组
int result = 0;
for (int i : args) {
result += i;
}
return result;
}
}
函数–难点
语法:
-
完整语法:
val 函数名称 :(参数类型)=>函数返回值类型 = (参数名称:参数类型)=>函数体
-
简写语法:
val函数名称 = (参数名称:参数类型) => 函数体
-
符号解释
= 表示将右边的函数赋给左边的变量
=> 左面表示输入参数名称和类型,右边表示函数的实现和返回值类型
与方法的区别
- Scala中的函数和方法类似,也是可以接收一些参数,进行一些操作,再返回
- 但是和方法不同的是,
方法隶属于对象/类和Java中的方法一样去理解即可
- Scala中的
函数
和Java8中新推出的函数式编程Lambda表达式一样,本质是对象
,有apply、curried、toString、tupled等方法 - Scala中函数继承自FuctionN,带有一个参数的函数的类型是function1,带有两个是function2,以此类推
- 也就是说 方法隶属于对象/类, 而函数本身就是对象!!!
证明函数是对象
调用方法
赋值给变量
作为参数进行传递
方法可以转换为函数
在方法后面加一个下划线
Java8中的函数
package cn.hanjiaxiaozhi.basic3;
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 16:10
* Desc 演示Java8中的函数
*/
public class FunctionDemo_Java {
public static void main(String[] args) {
//Java8中的匿名内部类实现一个Runnable线程任务对象
new Thread(
new Runnable() {
@Override
public void run() {
System.out.println("Runnable线程任务对象执行了");
}
}
).start();
//上面的写法是Java8之前的写法
//接下来使用Java8的写法,也就是使用函数式编程-Lambda表达式,格式为: (参数)->{函数体}
new Thread(
()->{
System.out.println("Runnable线程任务对象执行了--java8");
}
).start();
//还可以接着简写:
new Thread(()->System.out.println("Runnable线程任务对象执行了--java8")).start();
//为什么可以直接传入一个Lambda表达式给Thread(Runnable target)
//通过查看源码我们发现Thread(Runnable target)参数中要的是一个Runnable接口类型的对象
//而我们传入的是一个函数,也就是lambda ()->System.out.println("Runnable线程任务对象执行了--java8")
//那么就意味着我们传入的东西/函数 其实本质就是 Runnable接口类型的对象!
//也就是说Java8中的函数的本质是对象,准确的说是接口的匿名内部类实现对象
}
}
Scala中的函数-入门案例
- 本质
- Scala中的函数的本质就是对象
- 定义格式
- 1.完整语法
val 函数名 :(参数类型)=>返回值类型 = (参数名称:参数类型)=>{函数体}
- 2.简写语法
val 函数名 = (参数名称:参数类型)=>{函数体}
- 进一步简写
val 函数名 = (参数名称)=>函数体
- 代码演示
package cn.hanjiaxiaozhi.basic3
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 16:24
* Desc 演示Scala中的函数
*/
object FunctionDemo_Scala {
def main(args: Array[String]): Unit = {
//定义一个函数实现两个Int数的相加
//1.完整语法
//val 函数名 :(参数类型)=>返回值类型 = (参数名称:参数类型)=>{函数体}
val add1:(Int,Int)=>Int = (a:Int,b:Int) => {a + b}
//2.简写语法
//val 函数名 = (参数名称:参数类型)=>{函数体}
val add2 = (a:Int,b:Int) => {a + b}
//调用测试一下
val result1: Int = add1(1,2)
println(result1)//3
val result2: Int = add2(1,2)
println(result2)//3
}
}
Scala中的函数-证明Scala中的函数的本质是对象!
- 根据我们之前学习的编程语言,如果一个东西是对象的话,那么应该有如下的特征:
- 1.可以调用方法
- 2.可以作为值赋值给变量接收
- 3.可以当作参数被传递给方法
- 那么如果能演示出上面的三点不就证明了函数是对象嘛!!!
package cn.hanjiaxiaozhi.basic3
/**
* Author hanjiaxiaozhi
* Date 2020/7/13 16:24
* Desc 演示证明Scala中的函数的本质是对象
* 1.完整语法
* val 函数名 :(参数类型)=>返回值类型 = (参数名称:参数类型)=>{函数体}
* 2.简写语法
* val 函数名 = (参数名称:参数类型)=>{函数体}
*/
object FunctionDemo2_Scala {
def main(args: Array[String]): Unit = {
//根据我们之前学习的编程语言,如果一个东西是对象的话吗,那么应该有如下的特征:
//1.可以调用方法
//2.可以作为值赋值给变量接收
//3.可以当作参数被传递给方法
//那么如果能演示出上面的三点不就证明了函数是对象嘛!!!
//定义一些函数
val f1 = (x: Int) => x
val f2 = (x: Int, y: Int) => x + y
//证明1.函数可以调用方法--推出-->函数是对象
println(f1)//<function1>//直接打印函数,如果是对象的话,根据以前的经验,应该会调用对象的toString方法
println(f2)//<function2>
println(f1.toString())//<function1>//函数确实可以调用toString方法,那么如果和上面的打印结果一样,那么不就证明了我们的观点么!
println(f2.toString())//<function2>
//证明2.函数可以作为值赋值给变量接收--推出-->函数是对象
val f3 = f2 //f2是上面定义好的函数,现在赋值给fun变量了, 那么fun变量也成了函数
println(f3)//<function2>
//证明3.函数可以当作参数被传递给方法--推出-->函数是对象
val f4 = (x: Int, y: Int) => x + y
val result: Int = myMethod(1,2,f4) //f4是一个函数,现在被当作参数传递给了myMethod方法的fun参数了
println(result)//3
val result2: Int = f4(1,2)
println(result2)//3
}
//定义一个方法,该方法接收2个int值,和1个函数,并在方法体中调用该函数,将2个int值传个该函数
def myMethod(a:Int,b:Int,fun:(Int, Int) => Int):Int ={
fun(a,b)//在方法体中调用函数,并将函数的计算结果作为myMethod方法的返回值
}
}
- 在Scala中,方法可以转变为函数!
package cn.hanjiaxiaozhi.basic3
/**
* Author hanjiaxiaozhi
* Date 2020/7/14 9:37
* Desc 演示Scala中的方法可以转变为函数
*/
object FunctionDemo3_Scala {
def main(args: Array[String]): Unit = {
//定义一个函数
val fun = (x:Int,y:Int)=> x+y
//调用函数对象的toString
println(fun.toString())
//将方法转为函数并调用函数的toString
val fun_sum = sum _ //方法名 _ 表示将隶属于对象/类的方法直接转为一个函数对象
println(fun_sum.toString())
}
//定义一个方法
def sum(a:Int,b:Int):Int={
a+b
}
}
总结
1.Scala中的方法和函数的定义
- ●定义方法:
def 方法名(参数名1: 参数类型1, 参数名2: 参数类型2) : 返回类型 = {方法体}
- ●定义函数完整语法:
val函数名称 :(参数类型)=>函数返回值类型 = (参数名称:参数类型)=>函数体
- ●定义函数简写语法:
val函数名名称 = (参数名称:参数类型) => 函数体
2.Scala中的方法和函数
-
1.方法隶属于对象/类
-
2.函数本身就是对象
-
3.方法可以转为函数