【无标题】Scala函数基础

发布于:2025-04-03 ⋅ 阅读:(25) ⋅ 点赞:(0)

函数和方法的区别

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 聚合

 

object TestFunction {

 

def main(args: Array[String]): Unit = {

 

// 1map 映射

def map(arr: Array[Int], op: Int => Int) = { for (elem <- arr) yield op(elem)

}

 

val arr = map(Array(1, 2, 3, 4), (x: Int) => { x * x

})

println(arr.mkString(","))

 

// 2filter 过滤。有参数,且参数再后面只使用一次,则参数省略且后面参数用_表示

def filter(arr:Array[Int],op:Int =>Boolean) ={

var arr1:ArrayBuffer[Int] = ArrayBuffer[Int]() for(elem <- arr if op(elem)){ arr1.append(elem)

}

arr1.toArray

}

var arr1 = filter(Array(1, 2, 3, 4), _ % 2 == 1) println(arr1.mkString(","))

 

// 3reduce 聚合。有多个参数,且每个参数再后面只使用一次,则参数省略且后面参数用_表示,第n _代表第n 个参数

def reduce(arr: Array[Int], op: (Int, Int) => Int) = {

 

var init: Int = arr(0)

 

for (elem <- 1 until arr.length) { init = op(init, elem)

}

init

}

 

//val arr2 = reduce(Array(1, 2, 3, 4), (x, y) => x * y) val arr2 = reduce(Array(1, 2, 3, 4), _ * _) println(arr2)

}

}

 控制抽象

) 值调用:把计算后的值传递过去

 

object TestControl {

def main(args: Array[String]): Unit = { def f = ()=>{

println("f...")

 

 

object TestControl {

def main(args: Array[String]): Unit = { def f = ()=>{

println("f...")

10

}

 

foo(f())

}

 

//def foo(a: Int):Unit = {

def foo(a: =>Int):Unit = {

println(a)

}

}

输出结果:

f... 10 f...

10

 

注意:Java 只有值调用;Scala 既有值调用,又有名调用。

package com.zpark.chapter05 object TestFunctionDeclare {

def main(args: Array[String]): Unit = {

 

// 函数 1:无参,无返回值def test1(): Unit ={

println("无参,无返回值")

}

test1()

 

// 函数 2:无参,有返回值def test2():String={

return "无参,有返回值"

}

println(test2())

 

// 函数 3:有参,无返回值

def test3(s:String):Unit={ println(s)

}

 

test3("scala")

自定义一个 While 循环

 

object TestFunction {

def main(args: Array[String]): Unit = { var i:Int = 1

myWhile(i <= 10){ println(i)

i +=1

}

}

def myWhile(condition: =>Boolean)(op: =>Unit):Unit={ if (condition){

op myWhile(condition)(op)

}

}

}

 


网站公告

今日签到

点亮在社区的每一天
去签到