一、声明函数
(一)显式声明函数
案例演示
(1)加法函数
package net.huawei.day08
import scala.io.StdIn
/**
* 功能:显式声明函数
* 作者:
* 日期:2023年03月20日
*/
object Example01 {
def add1(a: Int, b: Int): Int = {
return a + b
}
def add2(a: Int, b: Int): Int = {
a + b
}
def add3(a: Int, b: Int) = {
a + b
}
def add4(a: Int, b: Int) = a + b
def add5(a: Int, b: Int) {
println(a + " + " + b + " = " + (a + b))
}
def main(args: Array[String]): Unit = {
print("a = ")
val a = StdIn.readLine().toInt
print("b = ")
val b = StdIn.readLine().toInt
println(a + " + " + b + " = " + add1(a, b))
println(a + " + " + b + " = " + add2(a, b))
println(a + " + " + b + " = " + add3(a, b))
println(a + " + " + b + " = " + add4(a, b))
add5(a, b)
}
}
运行程序,查看结果
(2)阶乘函数
package net.huawei.day08
import scala.io.StdIn
/**
* 功能:显式声明阶乘函数并调用
* 作者:
* 日期:2023年03月20日
*/
object Example02 {
def factorial(n: Int): Long = {
var jc = 1
(1 to n).foreach(i => jc = jc * i)
jc
}
def main(args: Array[String]): Unit = {
print("n = ")
val n = StdIn.readInt()
println(n.toString + "! = " + factorial(n))
}
}
``
![在这里插入图片描述](https://img-blog.csdnimg.cn/4fdd2b47b6e74111afef75280cf3271c.png)
```java
package net.huawei.day08
import scala.io.StdIn
/**
* 功能:隐式声明函数
* 作者:
* 日期:2023年03月20日
*/
object Example03 {
val add1 = (a: Int, b: Int) => {a + b}
val add2 = (a: Int, b: Int) => a + b
val add3 = (n: Int) => n + 1
def main(args: Array[String]): Unit = {
print("a = ")
val a = StdIn.readInt()
print("b = ")
val b = StdIn.readInt()
println(a + " + " + b + " = " + add1(a, b))
println(a + " + " + b + " = " + add2(a, b))
println(a + " + " + 1 + " = " + add3(a))
}
}
运行程序,查看结果
(二)隐式声明函数
案例演示
(1)加法函数
(2)三整数加法函数和阶乘函数
隐式声明三整数相加函数和阶乘函数
(3)打印直角三角形
方法一、采用传统的双重循环实现
方法二、采用单重循环配上流间变量来实现
方法三、采用映射算子(map())和遍历算子(foreach())来实现
(4)计算1 + 2 + 3 + …… + 100的值
不采用循环,而采用归约算子(reduce())算子来完成,归约算子传入一个匿名函数_ + _或(x, y) => x + y
二、Scala函数种类
(一)成员方法
案例演示
任务:显示文件中长度超过15的行
package net.huawei.day08
import scala.io.Source
/**
* 功能:显示文件中长度超过15的行
* 作者:
* 日期:2023年03月20日
*/
object Example04 {
def filter(line: String, len: Int): Boolean = {
line.length > len
}
def getLinesFromFile(path: String, len: Int) = {
val lines = Source.fromFile(path).getLines()
for (line <- lines if filter(line, len)) yield line
}
def main(args: Array[String]): Unit = {
val lines = getLinesFromFile("text.txt", 15)
for (line <- lines) println(line + " " + line.length)
}
}
(二)局部函数
案例演示
任务:采用局部函数显示文件中长度超过15的行
package net.huawei.day08
import scala.io.Source
/**
* 功能:采用局部函数显示文件中长度超过15的行
* 作者:
* 日期:2023年03月20日
*/
object Example05 {
def getLinesFromFile(path: String, len: Int) = {
def filter(line: String, len: Int): Boolean = {
line.length > len
}
val lines = Source.fromFile(path).getLines()
for (line <- lines if filter(line, len)) yield line
}
def main(args: Array[String]): Unit = {
val lines = getLinesFromFile("text.txt", 15)
for (line <- lines) println(line + " " + line.length)
}
}
运行程序,查看结果
(三)匿名函数
案例演示
任务:将函数赋值给常量
package net.huawei.day08
/**
* 功能:将函数赋值给常量
* 作者:
* 日期:2023年03月20日
*/
object Example06 {
def sum(a: Int, b: Int): Int = a + b
def main(args: Array[String]): Unit = {
// 直接调用显式函数
val r = sum(100, 150)
println("r = " + r)
// 将函数赋值给常量
val sum1 = sum(_, _)
val r1 = sum1(100, 150)
println("r1 = " + r1)
// 将函数固定一个参数后赋值给常量
val sum2 = sum(_: Int, 100)
val r2 = sum2(150)
println("r2 = " + r2)
// 将隐式函数赋值给常量
val sum3 = (a: Int, b: Int) => a + b
val r3 = sum3(100, 150)
println("r3 = " + r3)
}
}
运行程序,查看结果
(四)高阶函数
案例演示
任务1、演示函数作为函数的参数
package net.huawei.day08
/**
* 功能:演示函数作为函数的参数
* 作者:
* 日期:2023年03月20日
*/
object Example07 {
def printStr: (String) => Unit = {
x => println(x)
}
def main(args: Array[String]): Unit = {
val cities = List("北京", "上海", "深圳", "泸州")
cities.foreach(printStr)
}
}
运行程序,查看结果
任务2、演示函数作为函数的返回值
package net.huawei.day08
import scala.io.StdIn
/**
* 功能:演示函数作为函数的返回值
* 作者:华卫
* 日期:2023年03月20日
*/
object Example08 {
def findRecipe(name: String): (String) => (String) = {
if (name == "鸡肉") {
(food: String) => {
println("把" + food + "切丁,放在锅里烧,出锅")
"美味的宫保鸡丁"
}
} else if (name == "鸭子") {
(food: String) => {
println("把" + food + "洗干净,放在火上好,烤熟")
"美味的北京烤鸭"
}
} else {
(food: String) => {
println("把" + food + "洗净,放在锅里烧,烧熟")
"美味的食物"
}
}
}
def cook(food: String): String = {
val recipe = findRecipe(food)
recipe(food);
}
def main(args: Array[String]): Unit = {
print("食材:")
val food = StdIn.readLine()
println(cook(food))
}
}
运行程序,查看结果
三、神奇占位符
案例演示
任务1、演示过滤集合
package net.huawei.day08
/**
* 功能:过滤集合
* 作者:
* 日期:2023年03月20日
*/
object Example09 {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
println(list)
println("奇数子列表:" + list.filter((num: Int) => {
num % 2 == 1
}))
println("偶数子列表:" + list.filter(_ % 2 == 0))
}
}
运行程序,查看结果
任务2、演示处理集合
package net.huawei.day08
/**
* 功能:处理集合
* 作者:
* 日期:2023年03月20日
*/
object Example10 {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4, 5, 6, 7)
println(list)
list.foreach((x: Int) => {
print((x * 10) + "\t")
})
println()
println(list.map((x: Int) => {
x * 10
}))
println(list.map(_ * 10))
}
}
运行程序,查看结果
任务3、演示参数占位符
package net.huawei.day08
/**
* 功能:参数占位符
* 作者:
* 日期:2023年03月20日
*/
object Example11 {
def main(args: Array[String]): Unit = {
def sum(a: Int, b: Int, c: Int): Int = a + b + c
// 直接调用原函数
println("sum = " + sum(3, 4, 5))
// 全部参数使用占位符
val sum1 = sum(_, _, _)
println("sum1 = " + sum1(3, 4, 5))
var sum2 = sum _
println("sum2 = " + sum2(3, 4, 5))
// 部分参数使用占位符
val sum3 = sum(_, 4, _)
println("sum3 = " + sum3(3, 5))
}
}
运行程序,查看结果
四、闭包
案例演示
package net.huawei.day08
/**
* 功能:演示闭包
* 作者:
* 日期:2023年03月20日
*/
object Example12 {
def main(args: Array[String]): Unit = {
var x = 100
def sum(n: Int): Int = {
var sum = 0
var flag = true
for (i <- 1 to n if flag) {
sum = sum + i
if (x > 50) {
flag = false
}
}
x = 0
sum
}
println("x = " + x)
println("sum = " + sum(100))
println("x = " + x)
x = 25
println("x = " + x)
println("sum = " + sum(100))
println("x = " + x)
}
}
运行程序,查看结果
五、可变参数
案例演示
任务1、演示可变参数
package net.huawei.day08
/**
* 功能:演示可变参数
* 作者:
* 日期:2023年03月20日
*/
object Example13 {
def sum(nums: Int*): Int = {
var sum = 0
for (num <- nums) {
sum = sum + num
}
sum
}
def main(args: Array[String]): Unit = {
println(sum(1))
println(sum(1, 2))
println(sum(1, 2, 3))
println(sum(1, 2, 3, 4))
println(sum(1, 2, 3, 4, 5))
println(sum(1, 2, 3, 4, 5, 6))
println(sum(1, 2, 3, 4, 5, 6, 7))
}
}
运行程序,查看结果
任务2、定义任意多个数据求和的函数
package net.huawei.day08
/**
* 功能:任意多个数据求和的函数
* 作者:
* 日期:2023年03月20日
*/
object Example14 {
def addData(str: String, nums: Int*): String = {
var sum = 0
for (num <- nums) sum = sum + num
str + ": " + sum
}
def main(args: Array[String]): Unit = {
println(addData("泸州", 5, 6, 9))
println(addData("南京", 6, 3, 9, 7, 5))
}
}
运行程序,查看结果
六、尾递归
案例演示
任务:计算1 + 3 + 5…,总和刚好超过50就返回
package net.huawei.day08
/**
* 功能:计算1 + 3 + 5…,总和刚好超过50就返回
* 作者:
* 日期:2023年03月20日
*/
object Example15 {
def main(args: Array[String]): Unit = {
def fx(x: Int, sum: Int): Int = {
if (sum > 50) sum
else if (x >= 100) sum
else if (x % 2 == 0) {
print((x + 1) + "\t")
fx(x + 1, sum)
} else {
fx(x + 1, sum + x)
}
}
println("\nsum = " + fx(0, 0))
}
}
运行程序,查看结果