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

【Scala入门学习】Scala的方法和函数

1. 方法

在scala中的操作符都被当成方法存在,比如说+、-、*、/

1+2就是1.+(2)的调用,

2.0 是doule类型,强调用Int类型的写法为1.+(2:Int)

1.1 方法的声明和使用

定义方法的语法:

def 方法名([变量:变量类型,变量:变量类型]):返回值类型={方法体}

其中:

在scala 中,方法里面的最后一个表达式的值就是方法的返回值,不需要return 返回;

示例:

定义无参无返回值的方法:

// 定义无参无返回值的方法
scala> def say():Unit = {println("say hello")}
say: ()Unit
scala> say()
say hello
// 简化过程
scala> def say():Unit = {println("say hello")}
say: ()Unit
// 方法体有一个语句,省略{}
scala> def say():Unit = println("say hello")
say: ()Unit
// 方法返回值可以由方法体返回结果类型推测
scala> def say() = println("say hello")        
say: ()Unit
// 方法形参列表是空, 可省略()
scala> def say = println("say hello")
say: Unit
scala> say
say hello
scala> say()
<console>:13: error: Unit does not take parameterssay()
// 带有返回值的方法
def add(a:Int, b:Int):Int={val c = a + b; return c}

定义带有有参有返回值方法:

// 定义带有有参有返回值方法
scala> def add(a:Int, b:Int):Int={val c = a + b; return c}
add: (a: Int, b: Int)Int
scala> add(4,5)
res8: Int = 9
// 简化流程
scala> def add(a:Int, b:Int):Int={val c = a + b; return c}
add: (a: Int, b: Int)Int
// scala 不建议用return返回方法结果,默认最后一个就是方法的返回值
scala> def add(a:Int, b:Int):Int={val c = a + b; c}
add: (a: Int, b: Int)Int
// 去掉中间变量c
scala> def add(a:Int, b:Int):Int={a + b}
add: (a: Int, b: Int)Int
// 方法体有一个语句,省略{}
scala> def add(a:Int, b:Int):Int=a + b
add: (a: Int, b: Int)Int
// 方法返回值可以由方法体返回结果类型推测
scala> def add(a:Int, b:Int)=a + b
add: (a: Int, b: Int)Int
scala> add(4,5)
res9: Int = 9

方法的调用:

object M1 {def say(name:String) = {println(s"say ${name}")}def add(a:Int, b:Int) = a + bdef main(args: Array[String]): Unit = {// 普通调用M1.say("hainiu")// 中缀方法调用M1 say "hainiu"// 大括号调用,当只有一个入参时才能用M1 say {"hainiu"}M1.add(4,5)// 中缀方法调用M1 add (4,5)}
}

递归方法必须加返回值类型

scala> def calculate(number:Int):Int = {| if(number == 1)| 1| else| number*calculate(number-1)| }
calculate: (number: Int)Intscala> calculate(5)
res14: Int = 120//文件夹递归方式查询def listFiles(path:String):Unit = {val file = new File(path)if(file.isFile){println(file.getPath)}else{println(file.getPath)val list = file.list()for(p<-list){listFiles(path+"/"+p)}}}

可变参数

scala> def sum(x:Int*)={| var sum = 0| for(i<-x)| sum += i| sum| }
sum: (x: Int*)Intscala> sum(1,2,3)
res15: Int = 6scala> sum(1,2,3,4,5)
res16: Int = 15scala> def sum(x:Int,y:Int*)={| var sum = 0| for(i<-y)| sum += i| x * sum| }
sum: (x: Int, y: Int*)Intscala> sum(2,1,2,3)

2. 函数

在 java 中方法和函数是一个意思,在 scala 中方法和函数是两种含义。

方法:属于类或对象的成员

函数:是对象

在 scala 中,函数是一等公民。可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值;函数还可以赋给变量。

函数声明:

val 变量名:[变量类型1,变量类型2 => 函数体返回类型 ] = ([变量:变量类型,变量:变量类型]) => 函数体

示例:

// 函数本身是没有名字的--匿名函数
// function2 是 函数有 两个输入参数 和 一个输出, 本例是 两个Int输入,一个Int输出
scala> (a:Int, b:Int) => a + b
res10: (Int, Int) => Int = <function2>
scala> res10(4,5)
res11: Int = 9
// 把匿名函数赋给变量,这个变量名称就成了函数名称
scala> val add:(Int,Int)=>Int = (a:Int, b:Int) => a + b
add: (Int, Int) => Int = <function2>
scala> add(4,5)
res12: Int = 9

函数的结果做为方法的参数:

示例

// 定义周长函数
val perimeter = (a:Int,b:Int) => (a+b) *2
// 定义面积函数
val area = (a:Int, b:Int) => a*b
// 定义求和方法
def add(a:Int, b:Int) = a+b
// 计算长方形周长和面积的和
println(add(perimeter(4,5), area(4,5)))

函数作为参数和返回值:

scala> add2
res22: (Int, Int) => Int = $Lambda$1133/801476373@59919f37scala> val add = add2
add: (Int, Int) => Int = $Lambda$1133/801476373@59919f37scala> add(100,200)
res23: Int = 300scala> def calculate(x:Int,y:Int) = x+y
calculate: (x: Int, y: Int)Intscala> def calculate(x:Int,y:Int,f:(Int,Int)=>Int) = f(x,y)
calculate: (x: Int, y: Int, f: (Int, Int) => Int)Intscala> calculate(10,20,add)
res24: Int = 30scala> def sub(a:Int,b:Int) = a-b
sub: (a: Int, b: Int)Intscala> val sub = (a:Int,b:Int) => a-b
sub: (Int, Int) => Int = $Lambda$1137/1087688958@784ceacbscala> calculate(1,2,sub)
res25: Int = -1scala> def getFunc() = {| val func = (x:Int,y:Int) => x+y| func| }
getFunc: ()(Int, Int) => Intscala> getFunc()(1,2)
res26: Int = 3scala> def getFunc(a:Int,b:Int) = {| val func = (x:Int) => a*x +b| func| }
getFunc: (a: Int, b: Int)Int => Intscala> getFunc(2,1)(10)
res27: Int = 21

匿名函数

scala> def calculate(x:Int,y:Int) = x+y
calculate: (x: Int, y: Int)Intscala> def calculate(x:Int,y:Int,f:(Int,Int)=>Int) = f(x,y)
calculate: (x: Int, y: Int, f: (Int, Int) => Int)Intscala> val add = (x:Int,y:Int) => x+y
add: (Int, Int) => Int = $Lambda$1044/989321301@77049094scala> calculate(10,20,add)
res9: Int = 30scala> calculate(10,20,(x:Int,y:Int)=> x+y)
res10: Int = 30scala> (x:Int,y:Int) => x+y
res11: (Int, Int) => Int = $Lambda$1068/1578712821@106c988scala> res11(200,300)
res12: Int = 500scala> calculate(10,20,(x,y)=>x+y)
res13: Int = 30scala> (x,y)=> x+y
<console>:1: error: ';' expected but '=>' found.(x,y)=> x+y^

方法转换成函数

1)用空格下划线的方式

# 定义方法def add_def(a:Int,b:Int) = a + b# 方法转函数,用空格下划线的方式val add_func = add_def<空格>_

2)也可以把方法当参数使用,这也因为scala会隐式的把方法转换成函数,但并不是直接支持方法当参数的模式,只是做了隐式的转换,这种函数的转换分两种显示用空格_和隐式的,这也体现了scala灵活的地方。

cala> def add(x:Int,y:Int) = x+y
add: (x: Int, y: Int)Intscala> add 
<console>:13: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.add^
scala> add _
res16: (Int, Int) => Int = $Lambda$1076/287628665@335cdd2scala> calculate(1,2,add _)
res17: Int = 3scala> calculate(1,2,add)
res18: Int = 3

相关文章:

【Scala入门学习】Scala的方法和函数

1. 方法 在scala中的操作符都被当成方法存在&#xff0c;比如说、-、*、/ 12就是1.(2)的调用&#xff0c; 2.0 是doule类型&#xff0c;强调用Int类型的写法为1.(2:Int) 1.1 方法的声明和使用 定义方法的语法&#xff1a; def 方法名([变量&#xff1a;变量类型&#xff…...

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架&#xff08;如Spring、MyBatis等&#xff09;构成。在国内&#xff0c;有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…...

鸿蒙开发笔记_电商严选02_登录页面跳转到我的页面、并传值

鸿蒙开发笔记整理,方便以后查阅! 由于上班较忙,只能抽空闲暇时间,快速整理更新中。。。 登录页面跳转到我的页面、并传值 效果图 我的设置页面 /*** 我的设置页面*/ import CommonConstants from ./CommonConstants import ItemData from ./ItemData import DataModel fr…...

clip论文阅读(Learning Transferable Visual Models From Natural Language Supervision)

目录 摘要训练pre-train model的过程将pre-train model应用于下游任务应用&#xff08;待更新&#xff09; 论文/项目地址&#xff1a;https://github.com/OpenAI/CLIP 提供了clip的pre-trained model的权重&#xff0c;也可安装使用pre-trained model 摘要 使用标签标注的图…...

用于图像分割的协 SMA Transformer:同多注意力转换器 !

在医学图像分割中&#xff0c;基于注意力机制和卷积神经网络的Transformer在提高性能方面起到了重要作用。然而&#xff0c;早期的模型往往在分割小而形状不规则的肿瘤时表现不佳。 为此&#xff0c;作者提出了一种基于SMA架构&#xff08;Synergistic Multi-Attention&#xf…...

lodash中_.difference如何过滤数组

_.difference(array, [values]) 作用&#xff1a; 创建一个具有唯一array值的数组&#xff0c;每个值不包含在其他给定的数组中。&#xff08;注&#xff1a;即创建一个新数组&#xff0c;这个数组中的值&#xff0c;为第一个数字&#xff08;array 参数&#xff09;排除了给…...

关于C# 数据库访问 转为 C++ CLI 数据库访问

Db_.cs 与 csharp_db.h功能是一样的。 Db_.cs /**************************************************************************************** 创建时间 &#xff1a;2006年12月19日文件名 &#xff1a;Db_.cs功能 &#xff1a;数据库…...

百度移动刷下拉词工具:快速出下拉词的技术分析

都2024年了&#xff0c;你还在做SEO百度下拉&#xff1f;答案当然是肯定的&#xff0c;虽然百度的搜索流量不如从前&#xff0c;但移动端的流量依然是巨大的&#xff01;除了百度SEO快排以外&#xff0c;下拉也是一大流量入口&#xff0c;尤其是在移动端搜索的流量越来越大时&a…...

学习笔记-Golang中的Context

文章目录 1、什么是Context2、Context的作用3、Context的解析3.1、Context的源码解析3.2、 context包中实现context接口的四种结构体类型3.2.1、emptyCtx3.2.2、cancelCtx3.2.3、timerCtx3.2.4、valueCtx 4、总结 1、什么是Context Context是 Go 语言中的一个标准库&#xff0…...

ArrayList 源码解析

ArrayList是Java集合框架中的一个动态数组实现&#xff0c;提供了可变大小的数组功能。它继承自AbstractList并实现了List接口&#xff0c;是顺序容器&#xff0c;即元素存放的数据与放进去的顺序相同&#xff0c;允许放入null元素&#xff0c;底层通过数组实现。除该类未实现同…...

libgit2编译

1. 源码下载 libgit2源码下载 2. 编译要求 CMake下载 CMake教程 3. 编译步骤 Prerequisites Make sure CMake on your %PATH% Build Create a build directory beneath the libgit2 source directory, and change into it: mkdir build && cd buildCreate the …...

mac新手入门(快捷键)

系统常用快捷键 基本操作 Command-Z 撤销Command-X 剪切  Command-C 拷贝&#xff08;Copy&#xff09; Option Shift Command V 纯文本拷贝 Command-V 粘贴  Command-A 全选&#xff08;All&#xff09;Command-S 保存&#xff08;Save) Command-F 查找&#xff0…...

curl 的使用详解

curl 是一个非常强大的命令行工具&#xff0c;用于通过各种协议&#xff08;如 HTTP、HTTPS、FTP 等&#xff09;传输数据。它广泛应用于测试 API、下载文件、调试网络请求等。 下面是 curl 常用功能的详解及示例&#xff1a; 基本语法 curl [options] [URL]1. 基本请求 发起…...

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率&#xff0c;还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…...

CORS漏洞及其防御措施:保护Web应用免受攻击

1. 背景- 什么是CORS&#xff1f; 在当今互联网时代&#xff0c;Web 应用程序的架构日益复杂。一个后端服务可能对应一个前端&#xff0c;也可能与多个前端进行交互。跨站资源共享&#xff08;CORS&#xff09;机制在这种复杂的架构中起着关键作用&#xff0c;但如果配置不当&…...

C语言自定义类型结构体(24)

文章目录 前言一、结构体类型的声明结构体回顾结构体的特殊声明结构体的自引用 二、结构体的内存对齐对齐规则为什么存在内存对齐&#xff1f;修改默认对齐数 三、结构体传参四、结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段的应用位段使用的注意事项 总结 前言…...

补题篇--codeforces

传送门&#xff1a;Problem - 1881C - Codeforces 题目大意&#xff1a; 思路&#xff1a; 首先解决这个问题要知道 一个 ( x , y ) 顺时钟旋转 90 &#xff0c; 180 &#xff0c; 270可以得到 ( y , n - x 1 ) &#xff0c; ( n - x 1 , n - y 1 ) &#xff0c;( n - y …...

【字幕】恋上数据结构与算法之015动态数组03简单接口的实现

我们先来看一下&#xff0c;不要着急啊大家不要着急&#xff0c;这些东西我肯定会一点一点会给大家去实现&#xff0c;最终实现到跟Java官方版本差不多&#xff0c;只要我们自己实现了&#xff0c;偶尔类似的&#xff0c;你会发现你倒回去看Java官方的那个源码&#xff0c;你会…...

基于2023年网络赛赛题了解OpenCv

一、OpenCv图像读取与显示 1.图像的读取与显示 cv.imread() 图像读取&#xff0c;第一个参数是照片的位置一般是完整路径&#xff0c;第二个参数是指定图片输出的样式 cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。&#xff08;默认模式&#xff09;。cv.I…...

你到底更适合买虚拟主机还是服务器?

前言 在当今数字化的时代&#xff0c;选择合适的网络服务平台对于个人和企业来说至关重要。无论是搭建个人博客、运营企业网站还是开发游戏&#xff0c;服务器的选择都会直接影响到项目的成本、性能以及用户体验。那么&#xff0c;你到底适合虚拟主机还是服务器呢&#xff1f;…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...