【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中的操作符都被当成方法存在,比如说、-、*、/ 12就是1.(2)的调用, 2.0 是doule类型,强调用Int类型的写法为1.(2:Int) 1.1 方法的声明和使用 定义方法的语法: def 方法名([变量:变量类型ÿ…...

【JVM】概述
前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架(如Spring、MyBatis等)构成。在国内,有关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应用于下游任务应用(待更新) 论文/项目地址:https://github.com/OpenAI/CLIP 提供了clip的pre-trained model的权重,也可安装使用pre-trained model 摘要 使用标签标注的图…...

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

lodash中_.difference如何过滤数组
_.difference(array, [values]) 作用: 创建一个具有唯一array值的数组,每个值不包含在其他给定的数组中。(注:即创建一个新数组,这个数组中的值,为第一个数字(array 参数)排除了给…...

关于C# 数据库访问 转为 C++ CLI 数据库访问
Db_.cs 与 csharp_db.h功能是一样的。 Db_.cs /**************************************************************************************** 创建时间 :2006年12月19日文件名 :Db_.cs功能 :数据库…...

百度移动刷下拉词工具:快速出下拉词的技术分析
都2024年了,你还在做SEO百度下拉?答案当然是肯定的,虽然百度的搜索流量不如从前,但移动端的流量依然是巨大的!除了百度SEO快排以外,下拉也是一大流量入口,尤其是在移动端搜索的流量越来越大时&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 语言中的一个标准库࿰…...

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

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 拷贝(Copy) Option Shift Command V 纯文本拷贝 Command-V 粘贴 Command-A 全选(All)Command-S 保存(Save) Command-F 查找࿰…...

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

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走
随着科技的飞速发展,视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率,还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…...

CORS漏洞及其防御措施:保护Web应用免受攻击
1. 背景- 什么是CORS? 在当今互联网时代,Web 应用程序的架构日益复杂。一个后端服务可能对应一个前端,也可能与多个前端进行交互。跨站资源共享(CORS)机制在这种复杂的架构中起着关键作用,但如果配置不当&…...

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

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

【字幕】恋上数据结构与算法之015动态数组03简单接口的实现
我们先来看一下,不要着急啊大家不要着急,这些东西我肯定会一点一点会给大家去实现,最终实现到跟Java官方版本差不多,只要我们自己实现了,偶尔类似的,你会发现你倒回去看Java官方的那个源码,你会…...

基于2023年网络赛赛题了解OpenCv
一、OpenCv图像读取与显示 1.图像的读取与显示 cv.imread() 图像读取,第一个参数是照片的位置一般是完整路径,第二个参数是指定图片输出的样式 cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。(默认模式)。cv.I…...

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

linux手册翻译 addr2line
名称 addr2line 将地址转换为文件名和代码行数 简介 addr2line [-a|--addresses][-b bfdname|--targetbfdname][-C|--demangle[style]][-r|--no-recurse-limit][-R|--recurse-limit][-e filename|--exefilename][-f|--functions] [-s|--basename][-i|--inlines][-p|--pretty-…...

python-素数中的等差数列
题目描述 质数是在数论中很有意思的数,有很多题都可以围绕它来出,就如你眼前所见的这道题。 给定一个闭区间 [a,b] ,将此范围内的所有素数进行从小到大排序,对于连续的素数,我们可以发现很多等差数列(元素个数大于等于 3 )&#x…...

Unity3D 服务器AStar寻路客户端位置同步显示验证详解
在游戏开发中,经常需要在服务器和客户端之间同步玩家的位置信息,以便其他玩家可以看到他们的移动。本文将详细介绍如何在Unity 3D中使用AStar算法进行路径规划,并在服务器和客户端之间同步玩家的位置信息。 对惹,这里有一个游戏开…...

无人机之悬停精度篇
无人机的悬停精度是指无人机在无GPS信号或其他外部定位辅助下,能够保持在一个固定空间位置时的精度。这一精度受到多种因素的影响,包括但不限于风速、气压、温度、湿度以及无人机自身的姿态稳定性等。以下是对无人机悬停精度的详细分析: 一、…...

力扣题解2848
大家好,欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述(简单): 与车相交的点 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] [starti, endi] &…...

电子电气架构---智能汽车应该是怎么样的架构?
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...

无心剑七绝《中秋相思》
七绝中秋相思 中秋月满意深长 百代江阳老窖香 莫道天涯情不尽 相思寸寸赋华章 2023年9月29日 平水韵七阳平韵 这首诗七绝《中秋相思》由无心剑所作,以其深情的笔触描绘了中秋夜的相思之情。 诗中首句“中秋月满意深长”即以中秋圆月为起点,勾勒出了一幅…...

Python画笔案例-051 绘制赵爽弦图
1、绘制赵爽弦图 通过 python 的turtle 库绘制 赵爽弦图,如下图: 2、实现代码 绘制 赵爽弦图,以下为实现代码: """赵爽弦图.py本程序演录了如何自定义形状,如何把它添加到造型字典。赵爽弦图是用来证明…...

SEGGERS实时系统embOS推出Linux端模拟器
SEGGER 发布了两个新的 embOS 仿真模拟器:embOS Sim Linux 和 embOS-MPU Sim Linux。 通过模拟 Linux 主机系统上的硬件,取代物理硬件,为开发人员提供了一种无缝的方式来构建原型和测试应用程序。 embOS Sim Linux 端口支持 32 位和 64 位系…...

HTML + CSS - 网页布局之一般布局浮动布局
1. 一般布局 1.1 一般布局相关参数 元素内容常常可以想像为放在一个盒子里,然后在周边加上内边距,边框和外边距,是盒子模型 默认一个块级区域会填充父类所有的行向空间,并且沿着块伸长容纳其内容,可以为块状体设置某…...