1.8 掌握Scala函数

一、声明函数

(一)显式声明函数

案例演示
(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))
  }
}

运行程序,查看结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值