1.8 掌握Scala函数

news2024/11/27 19:42:48

一、声明函数

(一)显式声明函数

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试用例设计方法之因果图详解

一、因果图概述 因果图是从需求中找出因&#xff08;输入条件&#xff09;和果&#xff08;输出或程序状态的改变&#xff09;&#xff0c;通过分析输入条件之间的关系&#xff08;组合关系、约束关系等&#xff09;及输入和输出之间的关系绘制出因果图&#xff0c;再转化成判…

composer-创建自己的依赖库

1.环境 码云账号(或者GitHub)码云地址composer 官方仓库账号 Packagist composer官方仓库安装composer 2.步骤 2.1 发行composer的依赖包是需要从git 或者svn里拉取的,所以得先在码云里创建一个仓库 2.2 依赖包中必须有composer.json配置标明名字依赖等信息,配置大概如下,配…

Vue基础第五篇

一、动态组件 1.基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态组件</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></sc…

华为安全专家带你入门安全多方计算

安全多方计算 从0到1 6月8日&#xff08;本周四&#xff09; 19:00—21:00&#xff0c;华为安全专家带你入门安全多方计算&#xff0c;欢迎参加&#xff01; 考虑以下应用场景&#xff1a; Alice认为她可能患有某种遗传病&#xff0c;Bob有一个包含DNA模式与各类疾病的数据库。…

Hive执行计划之hive依赖及权限查询和常见使用场景

文章目录 概述1.explain dependency的查询与使用2.借助explain dependency解决一些常见问题2.1.识别看似等价的SQL代码实际上是不等价的&#xff1a;2.2 通过explain dependency验证将过滤条件在不同位置的查询区别 3.查看SQL操作涉及到的相关权限信息 概述 Hive查看执行计划的…

RocketMQ-Request-Reply特性

源码版本号:版本号:4.9.4 使用场景 随着服务规模的扩大&#xff0c;单机服务无法满足性能和容量的要求&#xff0c;此时需要将服务拆分为更小粒度的服务或者部署多个服务实例构成集群来提供服务。在分布式场景下&#xff0c;RPC是最常用的联机调用的方式。 在构建分布式应用…

高考季,17岁VS人工智能,谁的作文更胜一筹?

又到一年高考日。想起十二年前我也曾和众多莘莘学子一样,在这场人生的史诗里挣扎奋斗。 那时的我满怀着期待和焦虑,站在人生的岔口,茫然纠结该循哪条道路。十二年光阴荏苒,岁月如梭, 如今我已不复当年学子的面容,更无法回首当时的迷茫与彷徨。 时过境迁,我如今以另一种身份再…

flask+scrapy

管道数据库 class SpiderBookPipeline:def __init__(self):host localhostuser rootpassword hdp020820db 警察大学信息检索self.conn pymysql.connect(hosthost, useruser, passwordpassword, dbdb)self.cursor self.conn.cursor()def process_item(self, item, spider…

【Python】Python系列教程-- Python3 元组(十三)

文章目录 前言访问元组修改元组删除元组元组运算符元组索引&#xff0c;截取元组内置函数关于元组是不可变的 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–…

项目中的Echarts图表统计

数据可视化 一、Echarts二、前端&#xff08;VueEcharts&#xff09;HomeView.vue&#xff08;完整代码&#xff09; 三、后端&#xff08;SpringBootMyBatis&#xff09;BorrowController.javaIBorrowService.javaBorrowService.javadatetimeToDateStr()函数countList()函数 B…

同样是产品经理 段位差别大

同样是产品经理&#xff0c;段位差别大 趣讲大白话&#xff1a;做人的差距大 【趣讲信息科技189期】 **************************** 市场越内卷 对产品的要求越来越高 不管叫不叫产品经理这个头衔 产品开发的重要性不会降低 《人人都是产品经理》总结的段位 姑且一看&#xff…

java线程多线程并发

文章目录 对java线程的认识wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;区别&#xff1f;wait&#xff0c;notify为什么要放在同步代码块中&#xff1f; 多线程**什么时候使用多线程**&#xff1a;**多线程的优缺点**&#xff1a;**线程安全问题**&#xff1a…

MATLAB应用

目录 网站 智能图像色彩缩减和量化 网站 https://yarpiz.com/ 智能图像色彩缩减和量化 使用智能聚类方法&#xff1a;&#xff08;a&#xff09;k均值算法&#xff0c;&#xff08;b&#xff09;模糊c均值聚类&#xff08;FCM&#xff09;和&#xff08;c&#xff09;自组织神…

Mysql—存储过程

简介 存储过程就是类似于MySQL触发器&#xff0c;经过事先编写好相应语句&#xff0c;通过编译后存储在数据库上。触发器不需要手动调用即可实现相应SQL功能。MySQL存储过程&#xff0c;需要自己去调用得到相应的结果。 语法 创建存储过程 CREATE DEFINER CURRENT_USER PR…

git---->团队开发神器,一篇文章直接掌握

git---->团队开发神器&#xff0c;一篇文章直接掌握 一 学习git的原因概念版本的概念1 版本控制软件的基础功能2 集中式版本控制软件3 分布式版本控制 二 git的安装三 GitHub Desktop的使用四 团队操作五 中央服务器--github从github上下载文件到本地仓库传输文件 六 国内中…

chatgpt赋能python:Python如何实现自增

Python如何实现自增 在Python编程中&#xff0c;自增是一种非常常用的操作&#xff0c;它可以让我们在循环、计数等场景中更加方便地进行操作。实际上&#xff0c;在Python中&#xff0c;实现自增非常简单&#xff0c;本文将介绍Python中常用的自增操作&#xff0c;并分享自增…

时间复杂度 空间复杂度

概览 时间复杂度与空间复杂度的作用是在衡量一个算法的优劣性&#xff0c;以及在二者之间进行权衡&#xff0c;寻找二者的平衡点。 时间复杂度是指执行算法所需时间的增长率&#xff0c;而空间复杂度则是指执行算法所需存储空间的增长率。 高时间复杂度的算法可能需要在短时间…

LayUI前框框架普及版

LayUI 一、课程目标 1. 【了解】LayUI框架 2. 【理解】LayUI基础使用 3. 【掌握】LayUI页面元素 4. 【掌握】LayUI内置模块二、LayUI基本使用 2.1 概念 layui&#xff08;谐音&#xff1a;类UI) 是一款采用自身模块规范编写的前端 UI 框架&#xff0…

Nginx+Tomcat 负载均衡、动静分离

目录 一、Nginx代理服务器概念 1.正向代理 2.反向代理 二、动静分离 三、负载均衡 四、Nginx七层代理实验 1.部署Nginx服务 2. 部署Tomcat服务 2.1在192.168.88.50 虚拟机上部署双实例 2.2在192.168.88.60 上部署Tomcat服务器3 3.动静分离配置 3.1Tomcat1 server 配…

RecyclerView的回收缓存均由内部类Recycler完成

1. RecyclerView的三级缓存 通常在RecyclerView中存在着四级缓存&#xff0c;从低到高分别为&#xff1a; 可直接重复使用的临时缓存&#xff08;mAttachedScrap/mChangedScrap&#xff09; mAttachedScrap中缓存的是屏幕中可见范围的ViewHoldermChangedScrap只能在预布局状态…