scala方法与函数

| 定义方法 |
| 定义函数 |
| 方法和函数的区别 |
| scala的方法函数操作 |
1.9 方法与函数
1.9.1 定义方法
定义方法的基本格式是:
def 方法名称(参数列表):返回值类型 = 方法体
def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
//也可以定义成
//def add(x: Int, y: Int) = x + y
//或者
//def add(x: Int, y: Int){x + y} //省略“=”时始终返回Unit,一定要用大括号把方法体括起来
带有多参数列表的方法:
def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier println(addThenMultiply(1, 2)(3)) // 9
无参方法:不包括参数列表
def add=System.getProperty("user.name")
空参方法:
def add()=System.getProperty("user.name")
空参方法可以作为最终表达式出现,实际上是方法调用,只不过Scala规定空参方法的调用可以省略()。但是无参方法不允许使用调用,建议当成普通变量使用()。示例如下:
scala> def name:String = System.getProperty("user.name")
name: String
scala> name //当普通变量使用,但每次引用变量都会执行相应表达式
res0: String = liyadong
scala> name() //非法访问
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.name()^
scala> def name():String = System.getProperty("user.name")
name: ()String
scala> name //空参方法调用可以省略()
res2: String = liyadong
scala> name()
res3: String = liyadong
方法体是多行语句的表达式:
def getSquareString(input: Double): String = { val square = input * input square.toString
}
方法定义小结:
# 1. 方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型 # 2. 方法的返回值默认是方法体中最后一行表达式 的值,当然也可以用return来执行返回值,但不推荐这么做。 # 3. 若使用return来指定函数的返回值,scala的类型推断将会失效,要显式指定返回值类型。 # 4. 方法也可以没有返回值(返回值是Unit)省略=即可
package com.qianfeng.scala
/*** 方法*/
object Demo05_Func {def main(args: Array[String]): Unit = {//定义方法def add(a:Int,b:Int):Int = a+b//调用方法println(add(10,20))
//定义多个参数列表def addMultiple(a:Int,b:Int)(c:Int) = (a+b) * c
//定义无参数def add1 = System.getProperty("user.name")
//定义空参数def add2() = System.getProperty("user.name")
//调用println(addMultiple(10,20)(30))println(add1)//println(add1()) //无参数方法不能使用()调用println(add2())println(add2)
def add3(r:Double) = {val res = r*rprintln(res)res}println(add3(3))
//可变参数
//定义函数val f1 = (a:Int,b:Int) => a+bval f2 = (_:Int) + (_:Int)
//匿名函数//(a:Int) => a*100
//空参函数val username = () => System.getProperty("user.name")
//调用println(f1)println(f1(10,20))println(username)println(username())
//方法转换成函数val f11 = add _ //在方法名称后面加空格 _val f12 = add(_,_)println(f11)println(f12)println(f11(10,20))println(f12(10,20))}
}
1.9.2 定义函数
函数可以看做是带有参数的表达式。其本质是一个完整的对象,Scala 中的函数其实就是继承了Function(Trait) 的类的对象。
函数定义的基本语法:
val 变量 = (函数参数列表)=>函数体
函数的定义方式:
val f1 = ((a: Int, b: Int) => a + b) val f2 = (a: Int, b: Int) => a + b val f3 = (_: Int) + (_: Int) val f4: (Int, Int) => Int = (_ + _)
匿名函数:
(x: Int) => x + 1
var inc = (x:Int) => x+100
//变量inc现在是一种可以像函数那样使用的函数
var x = inc(7)-1
//还可以如下定义具有多个参数的函数:
var mul = (x: Int, y: Int) => x*y
//变量mul现在是可以像函数那样使用的函数
println(mul(3, 4))
//也可以定义不带参数的函数
var userDir = () => { System.getProperty("user.dir") }
//变量userDir现在是可以像函数那样使用的函数
println( userDir )
空参函数:
val getTheAnswer = () => 42 println(getTheAnswer()) // 42
1.9.3 方法和函数的区别
# 方法不能做为最终表达式出现,而函数可以 # 方法名是方法调用,而函数名只是代表函数对象本身 # 方法可以转换为函数,所以一般也不必严格区分 - 自动转换:在需要函数的地方,如果传递一个方法,Scala能够自动把方法转换为函数 - 手动转换
两种方式将方法转换成函数:
1、把方法作为参数传给另一个方法或者函数的时候,方法自动被转化成函数。
2、手动使用神奇的下划线_ 将方法被转化成函数:
scala> def m1(x:Int,y:Int) = x + y
m1: (x: Int, y: Int)Int
scala> val f1=m1 _ //方式一:方法被转化成函数
f1: (Int, Int) => Int = <function2>
scala> val f1=m1(_,_) //方式二:方法被转化成函数
f1: (Int, Int) => Int = <function2>
scala> val f1=m1 //不允许将方法直接赋值给变量,方法不是值,而函数与其他数据类型一样
<console>:12: error: missing argument list for method m1
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `m1 _` or `m1(_,_)` instead of `m1`.val f1=m1
^
1.9.4 Scala的方法函数操作
定义一个方法或函数实现随机组合车牌号,仅考虑后5位全是数字的情况。
//根据输入前缀返回随机车牌号,如输入“京A”,返回“京A88888”
def generateCarNo(prefix:String):String={var carNo=prefixfor(i<-1 to 5){val randNum=(Math.random()*10).toShort.toStringcarNo+=randNum} carNo
}
//使用函数
val generator=(prefix:String)=>{var carNo=prefixfor(i<-1 to 5){val randNum=(Math.random()*10).toShort.toStringcarNo+=randNum}carNo
}
//方法转换函数
val generator1=generateCarNo _ //注意空格
//或者
val generator2=generateCarNo(_)
//调用一个方法和三个函数
print(generateCarNo("京A"))
print(generator("京C"))
print(generator1("京D"))
print(generator2("京E"))
Guff_hys_python数据结构,大数据开发学习,python实训项目-CSDN博客
相关文章:
scala方法与函数
定义方法定义函数方法和函数的区别scala的方法函数操作 1.9 方法与函数 1.9.1 定义方法 定义方法的基本格式是: def 方法名称(参数列表):返回值类型 方法体 def add(x: Int, y: Int): Int x y println(add(1, 2)) // 3 //也…...
前端框架(Front-end Framework)和库(Library)的区别
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
mysql原理--B+树索引的使用
1.索引的代价 在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价,它在空间和时间上都会拖后腿: (1). 空间上的代价 这个是显而易见的,每建立一个索引都要为它建立一棵 B 树,每一棵 B 树的每一个节点都是一个数据页&…...
Android : Room 数据库的基本用法 —简单应用_三_版本
在实体类中添加了新字段: Entity(tableName "people") public class People {//新添加的字段private String email;public String getEmail() {return email;}public void setEmail(String email) {this.email email;}} 再次编译启动时会报错…...
微服务网关组件Gateway实战
1. 需求背景 在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?如果根据每个微服务的地址发起调用,存在如下问题: 客户端多次请求不同的微服务,会增加客户端代码…...
目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】三维重建(补充篇)
目录 前言 算法原理 三维重建意义 三维重建定义 常见的三维重建表达方式...
关于uniapp X 的最新消息
uni-app x 是什么? uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。 uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用的…...
spark从表中采样(随机选取)一定数量的行
在Spark SQL中,你可以使用TABLESAMPLE来按行数对表进行采样。以下是使用TABLESAMPLE的示例: SELECT * FROM table_name TABLESAMPLE (1000 ROWS);在这个示例中,table_name是你要查询的表名。TABLESAMPLE子句后面的(1000 ROWS)表示采样的行数…...
java定位系统源码,UWB技术的无线定位系统源码
UWB技术是一种传输速率高,发射功率较低,穿透能力较强并且是基于极窄脉冲的无线技术。UWB最优的应用环境是室内或者相对密闭的空间,有着厘米级的定位精度,不仅可以非常精准地进行位置跟踪,还可以快速地进行数据传输。 智…...
阿里云sls日志服务如何查某个具体字段的平均数
1: 需求: 查询线上某个接口(如:list_new)的成功率和时延 查接口时延的写法在网上找了一堆,都是语法错误,最后在阿里云官方api找到了正确的 2:贴一下阿里云官方文档: 聚…...
Java八股文面试全套真题【含答案】- Maven篇
以下是一些关于Maven的经典面试题以及它们的答案: 什么是Maven? Maven是一个项目管理工具,用于构建、发布和管理Java项目。它提供了一种标准化的项目结构、依赖管理和构建过程。Maven的核心概念是什么? Maven的核心概念包括POM文…...
从零构建属于自己的GPT系列6:模型本地化部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)
🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1:数据预处理 从零构建属于自己的GPT系列2:模型训…...
不同品牌的手机如何投屏到苹果MacBook?例如小米、华为怎样投屏比较好?
习惯使用apple全家桶的人当然知道苹果手机或iPad可以直接用airplay投屏到MacBook。 但工作和生活的多个场合里,并不是所有人都喜欢用同一品牌的设备,如果同事或同学其他品牌的手机需要投屏到MacBook,有什么方法可以快捷实现? 首先…...
路由和网络周期
### 路由(Routing): 1. **路由的概念:** 路由是用于确定用户在网站或应用程序中所处位置的机制。它可以将不同的 URL 映射到对应的页面或视图组件,使得用户可以通过不同的 URL 访问不同的内容。 2. **路由器…...
【算法与数据结构】332、LeetCode重新安排行程
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题比较属于困难题目,难点在于完成机票、出发机场和到达机场之间的映射关系,再…...
阶段五:深度学习和人工智能(掌握使用TensorFlow或PyTorch进行深度学习)
掌握使用TensorFlow或PyTorch进行深度学习需要具备一定的编程基础和数学基础,包括编程语言、数据结构、算法、线性代数、概率论和统计学等方面的知识。以下是掌握使用TensorFlow或PyTorch进行深度学习的一些基本要求: 了解深度学习的基本概念和原理&…...
DevEco Studio IDE 创建项目时候配置环境
DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…...
HTML面试题---专题二
文章目录 一、前言二、解释input标签中占位符属性的用途三、如何在 HTML 中设置复选框或单选按钮的默认选中状态?四、表单输入字段中必填属性的用途是什么?五、如何使用 HTML 创建表格?六、解释a标签中目标属性的用途七、如何创建一个点击后会…...
K12484 银行排队(bank)
题目描述 K个人来银行排队办理业务,银行有n个窗口可以同时办理,每个窗口允许有m个人排队,其余的人在银行大厅等待。当某个窗口排队人数少于m时,在大厅等待的人可进入该窗口排队。每个人都有自己要办的业务,每个业务要…...
JAVA实操经验
零: 按照需要,可以使用需要某个类下(主要是java提供的)的方法来实现某个功能。(主要是用在不同类下的方法会进行重写功能不同) 方法和构造方法不同:方法是方法,构造方法是构造器&a…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
