当前位置: 首页 > news >正文

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 定义方法 定义方法的基本格式是&#xff1a; def 方法名称&#xff08;参数列表&#xff09;&#xff1a;返回值类型 方法体 def add(x: Int, y: Int): Int x y println(add(1, 2)) // 3 //也…...

前端框架(Front-end Framework)和库(Library)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

mysql原理--B+树索引的使用

1.索引的代价 在介绍如何更好的使用索引之前先要了解一下使用这玩意儿的代价&#xff0c;它在空间和时间上都会拖后腿&#xff1a; (1). 空间上的代价 这个是显而易见的&#xff0c;每建立一个索引都要为它建立一棵 B 树&#xff0c;每一棵 B 树的每一个节点都是一个数据页&…...

Android : Room 数据库的基本用法 —简单应用_三_版本

在实体类中添加了新字段&#xff1a; Entity(tableName "people") public class People {//新添加的字段private String email;public String getEmail() {return email;}public void setEmail(String email) {this.email email;}} 再次编译启动时会报错&#xf…...

微服务网关组件Gateway实战

1. 需求背景 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对这么多微服务客户端应该如何去调用呢&#xff1f;如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 客户端多次请求不同的微服务&#xff0c;会增加客户端代码…...

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】三维重建(补充篇)

目录 前言 算法原理 三维重建意义 三维重建定义 常见的三维重建表达方式...

关于uniapp X 的最新消息

uni-app x 是什么&#xff1f; uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 没有使用js和webview&#xff0c;它基于 uts 语言。在App端&#xff0c;uts在iOS编译为swift、在Android编译为kotlin&#xff0c;完全达到了原生应用的…...

spark从表中采样(随机选取)一定数量的行

在Spark SQL中&#xff0c;你可以使用TABLESAMPLE来按行数对表进行采样。以下是使用TABLESAMPLE的示例&#xff1a; SELECT * FROM table_name TABLESAMPLE (1000 ROWS);在这个示例中&#xff0c;table_name是你要查询的表名。TABLESAMPLE子句后面的(1000 ROWS)表示采样的行数…...

java定位系统源码,UWB技术的无线定位系统源码

UWB技术是一种传输速率高&#xff0c;发射功率较低&#xff0c;穿透能力较强并且是基于极窄脉冲的无线技术。UWB最优的应用环境是室内或者相对密闭的空间&#xff0c;有着厘米级的定位精度&#xff0c;不仅可以非常精准地进行位置跟踪&#xff0c;还可以快速地进行数据传输。 智…...

阿里云sls日志服务如何查某个具体字段的平均数

1&#xff1a; 需求&#xff1a; 查询线上某个接口&#xff08;如&#xff1a;list_new&#xff09;的成功率和时延 查接口时延的写法在网上找了一堆&#xff0c;都是语法错误&#xff0c;最后在阿里云官方api找到了正确的 2&#xff1a;贴一下阿里云官方文档&#xff1a; 聚…...

Java八股文面试全套真题【含答案】- Maven篇

以下是一些关于Maven的经典面试题以及它们的答案&#xff1a; 什么是Maven&#xff1f; Maven是一个项目管理工具&#xff0c;用于构建、发布和管理Java项目。它提供了一种标准化的项目结构、依赖管理和构建过程。Maven的核心概念是什么&#xff1f; Maven的核心概念包括POM文…...

从零构建属于自己的GPT系列6:模型本地化部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…...

不同品牌的手机如何投屏到苹果MacBook?例如小米、华为怎样投屏比较好?

习惯使用apple全家桶的人当然知道苹果手机或iPad可以直接用airplay投屏到MacBook。 但工作和生活的多个场合里&#xff0c;并不是所有人都喜欢用同一品牌的设备&#xff0c;如果同事或同学其他品牌的手机需要投屏到MacBook&#xff0c;有什么方法可以快捷实现&#xff1f; 首先…...

路由和网络周期

### 路由&#xff08;Routing&#xff09;&#xff1a; 1. **路由的概念&#xff1a;** 路由是用于确定用户在网站或应用程序中所处位置的机制。它可以将不同的 URL 映射到对应的页面或视图组件&#xff0c;使得用户可以通过不同的 URL 访问不同的内容。 2. **路由器&#xf…...

【算法与数据结构】332、LeetCode重新安排行程

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题比较属于困难题目&#xff0c;难点在于完成机票、出发机场和到达机场之间的映射关系&#xff0c;再…...

阶段五:深度学习和人工智能(掌握使用TensorFlow或PyTorch进行深度学习)

掌握使用TensorFlow或PyTorch进行深度学习需要具备一定的编程基础和数学基础&#xff0c;包括编程语言、数据结构、算法、线性代数、概率论和统计学等方面的知识。以下是掌握使用TensorFlow或PyTorch进行深度学习的一些基本要求&#xff1a; 了解深度学习的基本概念和原理&…...

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 中设置复选框或单选按钮的默认选中状态&#xff1f;四、表单输入字段中必填属性的用途是什么&#xff1f;五、如何使用 HTML 创建表格&#xff1f;六、解释a标签中目标属性的用途七、如何创建一个点击后会…...

K12484 银行排队(bank)

题目描述 K个人来银行排队办理业务&#xff0c;银行有n个窗口可以同时办理&#xff0c;每个窗口允许有m个人排队&#xff0c;其余的人在银行大厅等待。当某个窗口排队人数少于m时&#xff0c;在大厅等待的人可进入该窗口排队。每个人都有自己要办的业务&#xff0c;每个业务要…...

JAVA实操经验

零&#xff1a; 按照需要&#xff0c;可以使用需要某个类下&#xff08;主要是java提供的&#xff09;的方法来实现某个功能。&#xff08;主要是用在不同类下的方法会进行重写功能不同&#xff09; 方法和构造方法不同&#xff1a;方法是方法&#xff0c;构造方法是构造器&a…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...