Scala04 方法与函数
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)可变参数
def test1(names:String*):Unit = { println(s"你好 $names") // 可变参数在函数值本质是一个数组 for (i <- names) { println(i) }
}
test1()
test1("张三")
test1("张三","李四")
- 默认参数(默认参数值)
// (2)参数默认值
def test2(name:String = "张三"):Unit = { println(s"hi ${name}")
} test2("王五")
test2()
- 指定参数(指定参数名进行传递)
// 默认值参数在使用的时候 可以不在最后
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 函数柯里化
- 柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
- 有多个参数列表的方法称之为柯里化
格式:
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()
}
注意事项:
- 递归要有跳出的逻辑(出口),不然会照常无限递归
- 递归有规律
- 递归必须要有函数返回值类型
案例:求数字 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)
}
相关文章:

Scala04 方法与函数
Scala04 方法与函数 Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象,可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似,是组成类的一部分 4.1.1 语法结构 格式&#x…...

XJTUSE专业课与实验指南(已经开源)
文章目录XJTUSE专业课与实验指南大一小学期大二上课程实验大二下课程实验大二小学期大三上课程实验大三下课程实验XJTUSE专业课与实验指南 github地址:https://github.com/yijunquan-afk/XJTUSE-NOTES.git 📄写在前面 1️⃣ 本篇文章仅供参考࿰…...

Spring面试专题
讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节点,当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本…...

【truncate、delete和drop的6大区别!】
在MySQL中,truncate、delete和drop是三个常用的命令,它们可以用于删除表或表中的数据,下面是它们的六大区别: 语法不同: truncate和delete是SQL语句,drop是DDL(数据定义语言)语句。…...

如何入门Vue:掌握Vue的核心概念和基本用法
Vue是一种流行的JavaScript框架,它可以让开发者更容易地构建响应式的用户界面。Vue的设计理念是简单易懂,它的核心库只关注视图层,可以与其它库或现有项目很好地结合。在本文中,我将介绍Vue的基础概念和如何开始使用Vue。Vue的基本…...

APM飞控使用动捕等外部定位
本文初次写于2023.03.03,pixhawk飞控应该是刷写了ArduPilot 4.1以上的版本。 机载计算机通过WIFI和vrpn_ros_client获取动捕系统(vicon或者nokov)的无人机定位数据(x,y,z四元数),然…...

【vulhub漏洞复现】CVE-2013-4547 Nginx 文件名逻辑漏洞
一、漏洞详情影响版本 Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7通过%00截断绕过后缀名的限制,使上传的php内容文件被解析执行。当Nginx得到一个用户请求时,首先对url进行解析,进行正则匹配,如果匹配到以.php后缀结尾的文件名&#x…...

Kubernetes中配置livenessProbe、readinessProbe和startupProbe
livenessProbe、readinessProbe和startupProbe作用kubelet使用livenessProbe(存活探针)来判断何时重启容器。例如,当程序中产生死锁的时候,程序还在运行,通过livenessProbe可以检测到程序已不能正常提供服务。这种情况…...

冰箱压缩机 方案
压缩机是制冷系统的心脏,它从吸气管吸入低温低压的制冷剂气体,通过电机运转带动活塞对其进行压缩后,向排气管排出高温高压的制冷剂气体,为制冷循环提供动力,从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…...

一文带你入门,领略angular风采(上)!!!
话不多说,上代码!!! 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…...

SpringMVC 参数绑定(视图传参到控制器)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

Three.js高级应用--利用Three.js+WebGL实现fbx和obj格式模型的自定义加载
通过对webgl和three.js的不断学习与实践,在三维应用场景建设过程中,利用Three.js与webgl配合可以实现大部分三维场景的应用需求,这一篇主要讲述如何利用Three.js加载已有的模型,支持的三维模型格式有.fbx和.obj,同时.o…...

Go struct
每个无名结构体类型的字面形式均由struct关键字开头,后面跟着用一对大括号{},其中包裹着的一系列字段(field)声明。 一般来说,每个字段声明由一个字段名和字段类型组成。一个结构体类型的字段数目可以为0。struct {tit…...

Redis多线程模型源码解析
1. 配置启用多线程 默认情况下多线程是默认关闭的,如果想要启动多线程,需要在配置文件中做适当的修改。 修改redis.conf 文件如下 io-threads 4 #启用的 io 线程数量 io-threads-do-reads yes #读请求也使用io线程2 源码解析 进入到Redis的main入口函…...

搭建zabbix4.0监控服务实例
一.Zabbix服务介绍 1.1服务介绍 Zabbix是基于WEB界面的分布式系统监控的开源解决方案,Zabbix能够监控各种网络参数,保证服务器系统安全稳定的运行,并提供灵活的通知机制让SA快速定位并解决存在的各种问题。 1.2 Zabbix优点 Zabbix分布式监…...

Xcode 系统崩溃问题01
参考链接:https://www.5axxw.com/questions/content/x2zlpx 问题:崩溃提示: Message from debugger: The LLDB RPC server has crashed. You may need to manually terminate your process. The crash log is located in ~/Library/Logs/Dia…...

SpringMVC文件上传、下载、国际化配置
Java知识点总结:想看的可以从这里进入 目录3.6、文件上传、下载3.6.1、文件上传3.6.2、文件下载3.7、国际化配置3.6、文件上传、下载 3.6.1、文件上传 form 表单想要具有文件上传功能,其必须满足以下 3 个条件。 form 表单的 method 属性必须设置为 p…...

计算机图形学07:有效边表法的多边形扫描转换
作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…...

UNIX编程--Makefile入门
Makefile 文件命名和规则 文件命名 makefile 或者 Makefile Makefile 规则 一个 Makefile 文件中可以有一个或者多个规则目标 ... : 依赖 ...命令 (shell 命令)...目标:最终要生成的文件,伪目标除外依赖:生成目标所需的文件或是目…...

【数据结构初阶】手撕单链表
目录一.链表概念和结构二.单链表功能的实现1.打印单链表内容2.申请单链表节点3.头插和尾插4.头删和尾删5.单链表查找6.pos位置前后插入7.pos位置删除三.链表面试题剖析一.链表概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素…...

angular中http请求和传值
有关angular传值的相关内容 <number-info[subTitle]"customTitle"[total]"item.ENERGY_RATE %"[subTotal]"item.ENERGY_RATE_DIFF %"[status]"item.ENERGY_RATE_DIFF > 0 ? up : down">在number-info上面,会是一个delon/c…...

VSCode问题记录
20230304 - 0. 引言 这几年的编程方式还真是各种变化,从一开始直接VIM,到后面使用jupyter进行机器学习相关,然后再过渡到vim的形式并加以tmux批量化,最后去年使用了vscode作为IDE。随着工具的变化,那么很多习惯也都随…...

html基础学习
初识HTML HTML: 超文本标记语言 一.HTML的基本结构 根控制标记(头) 头控制标记(头) 标题 标题标记 头控制标记(尾) 网页显示区域(一般要实现的代码都在这里写) </body> 根控制标记(尾) 二.网页的基本标签 标题标签 <h1> 一级标题</h1> <…...

leetcode_贪心算法
贪心算法相关题简单题目455.分发饼干1005.K次取反后最大化的数组和860.柠檬水找零序列问题376.摆动序列法一:贪心法法二:动态规划单调递增的数字简化版本有点难度53.最大子序和贪心算法动态规划134.加油站968.监控二叉树两个维度权衡问题分发糖果406.根据…...

C语言每日一题】——杨氏矩阵
【C语言每日一题】——倒置字符串😎前言🙌杨氏矩阵🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介…...

最佳iOS设备管理器imazing 2.16.9官网Mac/Windows下载电脑版怎么下载安装
imazing 2.16.9官网Mac/Windows下载电脑版是款针对苹果设备所打造的管理工具。iMazing为用户提供多种设备管理功能,每一位用户都能以自己的形式管理苹果设备。iMazing与苹果设备连接后,用户就可以轻松传输文件,浏览保存信息等。 应用介绍 iM…...

八大排序算法之堆排序的实现+经典TopK问题
目录 一.堆元素的上下调整接口 1.前言 2.堆元素向上调整算法接口 3.堆元素向下调整算法接口 二.堆排序的实现 1.空间复杂度为O(N)的堆排序(以排升序为例) 思路分析: 代码实现: 排序测试: 时空复杂度分析: 2. 空间复杂度为O(1)的堆排序(以排降序为例) 将数组arr调…...

使用AppSmith(PagePlug )低代码平台快速构建小程序应用实践
文章目录一、入门(一)介绍(二)功能特性(三)体验一下(四)参考教程二、使用Appsmith构建商城微信小程序(一)说明(二)应用配置࿰…...

第52章 短信验证服务和登录的后端定义实现
1 Services.Messages.SmsValidate using Core.Domain.Messages; using Data; using Microsoft.EntityFrameworkCore; namespace Services.Messages { /// <summary> /// 【短信验证服务--类】 /// <remarks> /// 摘要: /// 通过类中的方法成员实…...

谷歌验证码的使用
1. 表单重复提交之验证码 1.1 表单重复提交三种常见情况 提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。造成表单重复提交问题。解决方法:使用重定向来进行跳转用户正常提交服务器&…...