04 方法与函数

news2024/10/1 12:22:55

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/374665.html

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

相关文章

程序员是否要加入创业公司?

我从1月份入职到2月份离职&#xff0c;历时一个半月。短暂的体验了一段创业生活&#xff0c;更准确的说是一段“待在”创业团队的生活&#xff0c;因为我发现创业本身跟我关系不大。一个半月的就业经历&#xff0c;对任何人来说都不是一个好选择&#xff0c;当然也不是我所期望…

[oeasy]python0094_视频游戏_双人网球_pong_atari_mos_6502_雅达利_米洛华

编码进化 回忆上次内容 上次 我们回顾了 微软之前的 比尔盖茨和保罗艾伦 mits 迎来的 是帮手还是隐患&#xff1f; intel-8080 遇到了 mos-6502 底层硬件 驱动 游戏行业进化 不光是扑克牌和柏青哥了出现了双人网球 不过 目前的游戏 PDP-1 上的《太空大战》Donner Model 30 上…

K8S---pod基础概念

目录 一、资源限制 二、Pod 的两种使用方式 三、Pod 资源共享 四、底层容器Pause 1、Pause共享资源 1.1 网络 1.2 存储 1.3 小结 2、Pause主要功能 3、Pod 与 Pause 结构的设计初衷 五、Pod容器的分类 1、基础容器&#xff08;infrastructure container&#xff09;…

C++ Primer Plus 第6版 读书笔记(2)第2章 开始学习 C++

C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言&#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了 C的基本概念和技术&#xff0c;并专辟一章介绍了C11新增的功能…

企业网站自动生成系统的设计和实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着Internet技术的发展&#xff0c;人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于数字技术的发展&#xff0c;越来越数字化、网络化、电子化、虚拟化。Internet的发展历程以及目前的应用状况和发展趋势&…

BigGAN

1、BIGGAN 解读1.1、作者 Andrew Brock、Jeff Donahue、Karen Simonyan 1.2、摘要 尽管最近在生成图像建模方面取得了进展&#xff0c;但从 ImageNet 等复杂数据集中 成功生成高分辨率、多样化的样本仍然是一个难以实现的目标。为此&#xff0c;我们以迄 今为止最大的规模训练生…

使用MUI与H5+构建移动端app

前言 通过mui构建APP 效果图: <!DOCTYPE html> <html> <head><meta charset

c语言指针(结构体)

*结构体&#xff1a;-箭头&#xff08;->&#xff09;&#xff1a;左边必须为指针&#xff1b;-点号&#xff08;.&#xff09;&#xff1a;左边必须为实体。*函数传数组用指针传递&#xff1a;-传的是第一个的元素的指针-也就是说在函数里&#xff0c;形参只是一个指针&…

Delphi 中 FireDAC 数据库连接(总览)

本系列包含一组文章&#xff0c;描述了如何用在Delphi中使用FireDAC设置数据库驱动和管理数据库连接。通过这一些列文章的学习&#xff0c;将熟练掌握FireDAC数据库连接管理应用。自由使用FireDAC&#xff01;主题说明定义连接描述了如何存储和使用FireDAC连接参数以及连接定义…

sqlserver 数据库优化工具,安全性设置,并发设置,SQL耗时优化

当前数据库版本查询&#xff0c;硬件资源最大限度决定当前数据库实例的性能.数据库并发设置&#xff0c;理论最大连接数&#xff0c;当前实例数据库实例设置的最大连接数&#xff0c;决定高并发的连接数数据库连接字符串优化&#xff0c;是否复用&#xff0c;生命周期&#xff…

英语学术写作作业文章分析1

Abstract:a concise overview of the study研究简明概述 Introduction&#xff1a;1.providing the background 提供研究背景 2.indentifying the problem under study 了解正在研究的问题 3.evaluating previous studies评估之前的研究 4.identifying the research gap认识研…

GAIDC 2023盛会迎来大模型论坛“主场”,百度飞桨护航大模型产业发展

‍‍‍‍2月25日-26日&#xff0c;2023全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在上海临港举行&#xff0c;大会以“向光而行的AI开发者”为主题&#xff0c;汇聚了当前科技和产业革命中的开发者先锋力量。百度深度参与本次大会&#xff0c;飞桨联合上海市人工…

-source1.5中不支持diamond运算符终极解决办法

1. 常规办法 在File->Setting中设置如下&#xff1a; 然后检查&#xff1a;File->Project Structure里面的相关配置&#xff1a; 以上办法能解决问题的概率在90%&#xff0c;如果还不行&#xff0c;那么请按照以下方法&#xff0c;基本上100%可以解决。 如果还没解决则…

前端基础之CSS扫盲

文章目录一. CSS基本规范1. 基本语法格式2. 在HTML引入CSS3. 选择器分类二. CSS常用属性1. 文本属性2. 文本格式3. 背景属性4. 圆角矩形和圆5. 元素的显示模式6. CSS盒子模型7. 弹性布局光使用HTML来写一个前端页面的话其实只是写了一个大体的框架, 整体的页面并不工整美观, 而…

01 导入已有环境配置(上课使用)

一、导入虚拟机 通过 VMware 打开已经安装好的 集群 打开三个 将导入的虚拟机打开 第一次打开会需要选择方式 “我已移动虚拟机” 不会改变原虚拟机的配置 “我已复制虚拟机” 会去改变虚拟机mac地址&#xff0c;需要重新的去配置 mac 地址 选择 未列出 &#xff0c;以 root…

Matlab论文插图绘制模板第79期—无线条等高线填充图

资源群里有朋友问如何绘制等高线填充图&#xff0c;但删除线条&#xff0c;只保留填充颜色的那种。 那么&#xff0c;本期就来分享一下无线条等高线填充图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大…

【C语言进阶】指针与数组、转移表详解

前言 大家好我是程序猿爱打拳&#xff0c;我们在学习完指针的基本概念后知道了指针就是地址&#xff0c;我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的&#xff0c;因此学习完指针的基础后我们可以学习关于指针的进阶&#xff0c;其中…

WireShark如何进行USB包协议分析

USB协议学习的步骤之一就是从抓包看协议通信,进而学习usb设备开发是怎么回事。这里发现一个工具就是wireshark。 WireShark如果要抓取usb设备的包,需要在安装的时候,选择usbpcap一并进行安装。

惠普星14Pro电脑开机不了显示错误代码界面怎么办?

惠普星14Pro电脑开机不了显示错误代码界面怎么办&#xff1f;有用户电脑开机之后&#xff0c;进入了一个错误界面&#xff0c;里面有一些错误代码。重启电脑之后依然是无法进入到桌面中&#xff0c;那么这个情况怎么去进行解决呢&#xff1f;我们可以重装一个新系统&#xff0c…

Android自定义View实现打钩签到动画

效果图实现原理我们看实现的动画效果&#xff0c;其实是分为1. 绘制未选中状态图形&#xff08;圆弧和对号&#xff09;2. 绘制选中状态圆弧的旋转的动画3. 绘制选中状态圆弧向中心收缩铺满动画4. 绘制选中状态对号5. 绘制选中状态下圆的放大回弹动画6. 暴露接口接口回调传递选…