Scala04 方法与函数

news2024/11/20 14:44:14

Scala04 方法与函数

Scala 中的也有方法和函数的概念。
Scala中的 方法 是类的一部分。
Scala中的 函数 是一个对象,可以赋值给变量。

在类中定义的函数就是方法

4.1 方法

Scala 中方法 与 Java 中类似,是组成类的一部分

4.1.1 语法结构

格式:

def 方法名([参数列表]):[返回值类型] = {
	方法体
	rturn [结果]
}

rturn [结果] :返回的结果可以是任意合法的数据类型。
若没有返回值,则返回类型为“Unit”。

案例:定义方法用于计算两数之和

def add(a: Int, b: Int): Int = {  
  //定义变量 sum 用于接收两数相加  
  var sum: Int = 0  
  sum = a + b  
  return sum  
}

4.1.2 方法调用

方式1:

functionName( 参数列表 )

案例:

object Test {  
  def main(args: Array[String]): Unit = {  
    println("结果:" + add(3, 2))  
  }  
  
  def add(a: Int, b: Int): Int = {  
    //定义变量 sum 用于接收两数相加  
    var sum: Int = 0  
    sum = a + b  
    return sum  
  }  
}

方式2:

方法使用实例的对象来调用,我们可以使用类似java的格式 (使用 .)[instance.]functionName( 参数列表 )

案例:

object Test {  
  def main(args: Array[String]) {  
    println("结果 : " + Test.add(2, 3));  
  }  
  
  def add(a: Int, b: Int): Int = {  
    //定义变量 sum 用于接收两数相加  
    var sum: Int = 0  
    sum = a + b  
    return sum  
  }  
}

4.1.3 方法参数

  1. 可变参数(不定长参数)
// (1)可变参数  
def test1(names:String*):Unit = {  
  println(s"你好 $names")  
  // 可变参数在函数值本质是一个数组  
  for (i <- names) {  
    println(i)  
  }  
}  
test1()  
test1("张三")  
test1("张三","李四")

  1. 默认参数(默认参数值)
// (2)参数默认值  
def test2(name:String = "张三"):Unit = {  
  println(s"hi ${name}")  
}  
  
test2("王五")  
test2()

  1. 指定参数(指定参数名进行传递)
// 默认值参数在使用的时候 可以不在最后  
def test3(name: String = "李四", age: Int): Unit = {  
  println(s"姓名: ${name} 年龄:${age}")  
}  
// (4)带名参数  
test3(age = 10)

3.1.4 方法注意

*方法定义可遵循至简原则:能省则省
(1)return可以省略,Scala会使用方法体的最后一行代码作为返回值
(2)如果方法体只有一行代码,可以省略花括号
(3)返回值类型如果能够推断出来,那么可以省略(和返回值类型一起省略)

注意事项:

*1. 如果有return,则不能省略返回值类型,必须指定
2. 如果方法明确声明unit,那么即使方法体中使用return关键字也不起作用
3. Scala如果期望是无返回值类型,可以省略等号(=号和方法体大括号不能同时省略)
4. 如果方法无参,但是声明了参数列表,那么调用时,小括号,可加可不加(声明无括号调用时也没有括号)
5. 如果方法没有参数列表,那么小括号可以省略,调用时小括号必须省略


4.2 函数

函数定义可以使用 val 和 def(在类中定义的函数就是方法) ,def 定义的形式和方法一样

4.2.1 语法结构

格式:

val 函数名 = ([参数列表]) => {
	函数体
}
=> : 函数标识符

案例:定义函数用于计算两整数之和

//1、函数定义  
val add = (a: Int, b: Int) => {  
  a + b  
}  
//2、函数调用  
println(add(5, 5))

4.2.2 方法和函数区别

*1)方法定义在类中可以实现重载,函数不可以重载
2)方法是保存在方法区,函数是保存在堆中
3)定义在方法中的方法可以称之为函数,不可以重载
4)方法可以转成函数, 转换语法: 方法名 _ (方法名+空格+下划线)

  • 方法 转换 为 函数 (方法名 _ ) / (方法名+空格+下划线)
//定义一个方法
def add(x:Int,y:Int) = x+y
//方法转成函数 (方法名+空格+下划线)
val add2 = add _

4.2.3 高阶函数

*高阶函数(Higher-Order Function)就是操作其他函数的函数
定义:参数/返回值为函数的方法/函数称为高阶函数

案例:

object TestFunction {  
  def main(args: Array[String]): Unit = {  
    //    val func = new Function2[Int, Int, Int] {  
    //      override def apply(v1: Int, v2: Int): Int = v1 + v2    //    }  
    //定义函数  
    val func = (x: Int, y: Int) => x + y  
    //调用高阶函数  
    println(add(10, 20, func))  
  }  
  
  //def add( x:Int ,y:Int , func: Function2[Int,Int,Int] )  
  def add(x: Int, y: Int, func: (Int, Int) => Int) = {  
    func(x, y)  
  }  
}

4.2.4 匿名函数

没有名字的函数/方法就是匿名函数。

格式:

(x:Int)=>{函数体}

案例:

var inc = (x:Int) => x+1
相当于:
def add2 = new Function1[Int,Int]{  
    def apply(x:Int):Int = x+1;  
}
//TODO 匿名函数一般用于给高阶函数传值使用
m1(10,20,(x:Int,y:Int) => x+y )

def m1(x:Int,y:Int, func: (Int,Int)=>Int) = {
	func(x,y)
}

4.2.5 闭包

*1. 闭包:如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包
2. 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
3. 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。
比如:val multiplier = (i:Int) => i * 10

案例:函数体内有一个变量 i,它作为函数的一个参数

在 multiplier 中有两个变量:i 和 factor。其中的一个 i 是函数的形式参数,然而,factor不是形式参数,而是函数外面定义的变量,
var factor = 3  
val multiplier = (i:Int) => i * factor

4.2.6 函数柯里化

  1. 柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
  2. 有多个参数列表的方法称之为柯里化

格式:

def 方法名(参数名:类型,...)(参数名:类型,...)...:返回值类型 = {方法体}

案例:

//定义普通函数 add
def add(x:Int,y:Int)=x+y
println(add(2,3))

在调用函数 add 时 写法为:add(2,3)

将刚才定义的函数 变形

def add(x:Int)(y:Int) = x + y
println(add(1)(2))

在调用函数 add 时 写法变为为:add(2)(3),这种方式(过程)就叫柯里化。

完整案例:

object Test {
   def main(args: Array[String]) {
      val str1:String = "Hello, "
      val str2:String = "Scala!"
      println( "str1 + str2 = " +  strcat(str1)(str2) )
   }

   def strcat(s1: String)(s2: String) = {
      s1 + s2
   }
}

4.2.7 递归

*一个函数/方法在函数/方法体内又调用了本身,我们称之为递归调用

Scala 同 其他语言一样 也支持递归

格式:自己调用自己

def test()={
	test()
}

注意事项:

  1. 递归要有跳出的逻辑(出口),不然会照常无限递归
  2. 递归有规律
  3. 递归必须要有函数返回值类型

案例:求数字 n 的 阶乘

object TestFunction {  
  
  def main(args: Array[String]): Unit = {  
    // 案例: 求 n 的阶乘.  
    print("几的阶乘:")  
    val n: Int = StdIn.readInt()  
    //2. 调用factor方法, 用来获取n的阶乘.  
    val num = factor(n)  
    //3. 打印结果.  
    println(num)  
  }  
  
  //1. 定义方法, 用来求数字n的阶乘.  
  def factor(n: Int): Int = if (n == 1) 1 else n * factor(n - 1)  
}

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

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

相关文章

数据库“啃”不动?CnosDB带你轻松阅读十万行源码!

最近一直有社区的小伙伴问&#xff0c;我们很感兴趣CnosDB&#xff0c;但从何开始阅读CnosDB的代码呢&#xff0c;其实这个问题在之前的CnosDB HiTea直播时就有聊到&#xff0c;今天我们就再来回顾一下。CnosDB的源代码主要分为Query Engine和Storage Engine。Query Engine在qu…

JOSN数据转换和解析

文章目录JOSN数据转换和解析内容回顾Map 集合转成 JSON 字符串List 集合转换成 JSON 字符串Ajax 异步和同步异步概念同步概念异步和同步区别异步请求案例同步请求时间格式化旧时间 api 格式化格式化和解析的工具类JSTL 时间格式化JSTL 使用JOSN数据转换和解析 内容回顾 ajax …

指针的进阶续(笔试题强化练习)

写在前面&#xff1a;在上次我们学习了指针的相关类型的知识&#xff0c;对指针家族的成员基本有了了解&#xff0c;这次让我们跟着一些题目来练习和补充一些知识&#xff0c;这有助于我们强化理解这些知识。 话不多说&#xff0c;我们马上开始&#xff1a; 1.指针和数组的笔…

Vue基础学习 第一个Vue程序 el挂载点 v-指令(1)

Vue简介 Vue是一个Javascript框架Vue框架可以简化Dom操作响应式数据驱动 &#xff1a; 页面是由数据生成的&#xff0c;当数据出现改动&#xff0c;页面也会即时改变 第一个Vue程序 Vue中文文档官网&#xff1a;https://v2.cn.vuejs.org/v2/guide/ 根据官方文档的说法&#…

缓存与数据库的双写一致性

背景 在高并发的业务场景下&#xff0c;系统的性能瓶颈往往是出现在数据库上&#xff0c;用户并发访问过大&#xff0c;压力都打到数据库上。所以一般都会用redis做缓存层&#xff0c;起到一个缓冲作用&#xff0c;让请求先访问到缓存层&#xff0c;而不是直接去访问数据库&am…

Web3D发展趋势以及Web3D应用场景

1&#xff0c;Web3D发展趋势随着互联网的快速发展&#xff0c;Web3D技术也日渐成熟&#xff0c;未来发展趋势也值得关注。以下是Web3D未来发展趋势的七个方面&#xff1a;可视化和可交互性的增强&#xff1a;Web3D可以为三维数据提供可视化和可交互性的增强&#xff0c;将极大地…

CCNP350-401学习笔记(补充题目101-186)

101、 enable the https service 102、fabric edge node 103、 104、 105、 16113 106、filter access-group 10 107、 108、VETP 109、 110、 111、the server and the database can inititate communication 112、 113、 114、 115、 116、WAN edge&#xf…

【教程】去水印开源工具Lama Cleaner在Windows的安装和使用

一、Lama Cleaner是什么&#xff1f; Lama Cleaner是一款开源且免费的人工学习图片去水印程序&#xff08;个人主要学习用途&#xff09;&#xff0c;没有图片分辨率限制&#xff08;个人使用暂未发现&#xff09;&#xff0c;并且保存的图片质量很高&#xff08;个人觉得跟原…

MSTP多进程讲解与实验配置

目录 MSTP多进程 专业术语 MSTP多进程配置 在MSTP域配置 MSTP多进程 多进程的作用 将设备上的端口绑定到不同的进程中&#xff0c;以进程为单位进行MSTP计算&#xff0c;不在同一进程内的端口不参与此进程中的MSTP协议计算&#xff0c;实现各个进程之间的生成树计算相互独立…

【算法】DFS与BFS

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;题目的模拟很重要&#xff01;&#xff01;&#x1f43e; 文章目录1.区别2.DFS2.1 排列数字2.2 n-皇后问题3.BFS3.1走迷宫1.区别 搜索类型数据结构空间用途过程DFSstackO( n )不能用于最短路搜索到最深处&a…

leetcode打卡-深度优先遍历和广度优先遍历

200.岛屿数量 leetcode题目链接&#xff1a;https://leetcode.cn/problems/number-of-islands leetcode AC记录&#xff1a; 思路&#xff1a;深度优先遍历&#xff0c;从0&#xff0c;0开始遍历数组&#xff0c;使用boolean类型数组used记录是否被访问过&#xff0c;进行一…

28个案例问题分析---014课程推送页面逻辑整理--vue

一&#xff1a;背景介绍 项目开发过程中&#xff0c;前端出现以下几类问题&#xff1a; 代码结构混乱代码逻辑不清晰页面细节问题 二&#xff1a;问题分析 代码结构混乱问题 <template><top/><div style"position: absolute;top: 10px"><C…

SpringBoot监听机制-以及使用

11-SpringBoot事件监听 Java中的事件监听机制定义了以下几个角色&#xff1a; ①事件&#xff1a;Event&#xff0c;继承 java.util.EventObject 类的对象 ②事件源&#xff1a;Source &#xff0c;任意对象Object ③监听器&#xff1a;Listener&#xff0c;实现 java.util…

奇思妙想:超链接唤起本地应用

文章目录分析实现参考很多人的博客都有这样的小玩意&#xff0c;点击之后就可以直接与博主进行对话&#xff0c;而且无需添加好友。 先研究一下网页源代码&#xff1a; <a href"tencent://message/?uin88888888&Siteqq&Menuyes">联系我</a>很明…

Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析

paper&#xff1a;Decoupled Knowledge Distillationcode&#xff1a;https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/DKD.py背景与基于响应logits-based的蒸馏方法相比&#xff0c;基于特征feature-based的蒸馏方法在各种任务上的表现更好…

【教学典型案例】14.课程推送页面整理-增加定时功能

目录一&#xff1a;背景介绍1、代码可读性差&#xff0c;结构混乱2、逻辑边界不清晰&#xff0c;封装意识缺乏![在这里插入图片描述](https://img-blog.csdnimg.cn/bbfc5f04902541db993944ced6b62793.png)3、展示效果不美观二&#xff1a;案例问题分析以及解决过程1、代码可读性…

现代操作系统——Linux架构与学习

小白的疑惑 在我决定从事嵌入式&#xff08;应用层&#xff09;方面的工作时&#xff0c;我查询了大量资料该如何学习&#xff0c;几乎所有观点不约而同的都指向了学习好Linux&#xff0c;大部分工作都是在Linux环境下来进行工作的。于是我雄心勃勃的去下载Linux&#xff0c;可…

GEE开发之降雨(CHIRPS)数据获取和分析

GEE开发之降雨CHIRPS数据获取和分析1.数据介绍2.初识CHIRPS2.1 代码一2.2 代码二3.逐日数据分析和获取4.逐月数据分析和获取4.1 代码一4.2 代码二(简洁)5.逐年数据分析和获取5.1 代码一5.2 代码二(简洁)前言&#xff1a;主要获取和分析UCSB-CHG/CHIRPS/DAILY的日数据、月数据和…

一文带你入门,领略angular风采(上)!!!

话不多说&#xff0c;上代码&#xff01;&#xff01;&#xff01; 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…

32 openEuler使用LVM管理硬盘-管理卷组

文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…