函数和方法的区别
1) 核心概念
(1) 为完成某一功能的程序语句的集合,称为函数。
(2) 类中的函数称之方法。
2) 案例实操
(1) Scala 语言可以在任何的语法结构中声明任何的语法
(2) 函数没有重载和重写的概念;方法可以进行重载和重写
(3) Scala 中函数可以嵌套定义
object TestFunction {
// (2)方法可以进行重载和重写,程序可以执行def main(): Unit = {
}
def main(args: Array[String]): Unit = {
// (1)Scala 语言可以在任何的语法结构中声明任何的语法
import java.util.Date new Date()
// (2)函数没有重载和重写的概念,程序报错def test(): Unit ={
println("无参,无返回值")
}
test()
def test(name:String):Unit={ println()
}
//(3)Scala 中函数可以嵌套定义
def test2(): Unit ={
5.1.3 函数定义
1) 函数定义
(1) 函数 1:无参,无返回值
(2) 函数 2:无参,有返回值
(3) 函数 3:有参,无返回值
(4) 函数 4:有参,有返回值
(5) 函数 5:多参,无返回值
for {
i <- 1 to 3 j = 4 - i
} {
println("i=" + i + " j=" + j)
}
5.1.4 函数参数
1) 案例实操
(1) 可变参数
(2) 如果参数列表中存在多个参数,那么可变参数一般放置在最后
(3) 参数默认值,一般将有默认值的参数放置在参数列表的后面
(4) 带名参数
object TestFunction {
def main(args: Array[String]): Unit = {
// (1)可变参数
def test( s : String* ): Unit = { println(s)
}
// 有输入参数:输出 Array test("Hello", "Scala")
// 无输入参数:输出List() test()
// (2)如果参数列表中存在多个参数,那么可变参数一般放置在最后def test2( name : String, s: String* ): Unit = {
println(name + "," + s)
}
test2("jinlian", "dalang")
// (3)参数默认值
def test3( name : String, age : Int = 30 ): Unit = {
函数至简原则(重点)
函数至简原则:能省则省
1) 至简原则细节
(1) return 可以省略,Scala 会使用函数体的最后一行代码作为返回值
(2) 如果函数体只有一行代码,可以省略花括号
(3) 返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)
(4) 如果有 return,则不能省略返回值类型,必须指定
(5) 如果函数明确声明unit,那么即使函数体中使用 return 关键字也不起作用
(6) Scala 如果期望是无返回值类型,可以省略等号
(7) 如果函数无参,但是声明了参数列表,那么调用时,小括号,可加可不加
(8) 如果函数没有参数列表,那么小括号可以省略,调用时小括号必须省略
(9) 如果不关心名称,只关心逻辑处理,那么函数名(def)可以省略
高阶函数
在 Scala 中,函数是一等公民。怎么体现的呢? 对于一个函数我们可以:定义函数、调用函数
1) 函数可以作为值进行传递
object TestFunction {
def main(args: Array[String]): Unit = {
//(1)调用 foo 函数,把返回值给变量f
//val f = foo() val f = foo println(f)
2) 函数可以作为参数进行传递
def main(args: Array[String]): Unit = {
//(1)定义一个函数,函数参数还是一个函数签名;f 表示函数名称;(Int,Int)表示输入两个 Int 参数;Int 表示函数返回值
def f1(f: (Int, Int) => Int): Int = { f(2, 4)
}
// (2)定义一个函数,参数和返回值类型和f1 的输入参数一致
def add(a: Int, b: Int): Int = a + b
// (3)将 add 函数作为参数传递给 f1 函数,如果能够推断出来不是调用,_ 可以省略
println(f1(add)) println(f1(add _))
//可以传递匿名函数
}
3) 函数可以作为函数返回值返回
def main(args: Array[String]): Unit = { def f1() = { def f2() = {
} f2 _ }
val f = f1() // 因为f1 函数的返回值依然为函数,所以可以变量f 可以作为函数继续调用 f() // 上面的代码可以简化为 f1()() 匿名函数 1) 说明 没有名字的函数就是匿名函数。 (x:Int)=>{函数体} x:表示输入参数类型;Int:表示输入参数类型;函数体:表示具体代码逻辑2)案例实操 需求 1:传递的函数有一个参数传递匿名函数至简原则: (1) 参数的类型可以省略,会根据形参进行自动的推导 (2) 类型省略之后,发现只有一个参数,则圆括号可以省略;其他情况:没有参数和参数超过 1 的永远不能省略圆括号。 (3) 匿名函数如果只有一行,则大括号也可以省略
(4) 如果参数只出现一次,则参数省略且后面参数可以用_代替 def main(args: Array[String]): Unit = {
// (1)定义一个函数:参数包含数据和逻辑函数 def operation(arr: Array[Int], op: Int => Int) = { for (elem <- arr) yield op(elem) }
// (2)定义逻辑函数 def op(ele: Int): Int = { ele + 1 }
// (3)标准函数调用 val arr = operation(Array(1, 2, 3, 4), op) println(arr.mkString(","))
// (4)采用匿名函数 val arr1 = operation(Array(1, 2, 3, 4), (ele: Int) => { ele + 1 })
需求 2:传递的函数有两个参数
object TestFunction {
def main(args: Array[String]): Unit = {
def calculator(a: Int, b: Int, op: (Int, Int) => Int): Int = { op(a, b) }
// (1)标准版 println(calculator(2, 3, (x: Int, y: Int) =>{x +y}))
// (2)如果只有一行,则大括号也可以省略 println(calculator(2, 3, (x: Int, y: Int) =>x + y))
// (3)参数的类型可以省略,会根据形参进行自动的推导; println(calculator(2, 3, (x , y) =>x +y))
// (4)如果参数只出现一次,则参数省略且后面参数可以用_代替 println(calculator(2, 3, _ + _)) } }
高阶函数案例 需求:模拟 Map 映射、Filter 过滤、Reduce 聚合
|