Scala中的方法函数的定义
作者:林伟兵,叩丁狼高级讲师。本文为原创文章,转载请注明出处。
4. 方法&函数的定义
在scala中,函数是一等公民,但是一般在开发中,函数和方法是可以相互代替的。
4.1 方法的定义
一个完整方法的定义如下
scala> def add(a:Int, b:Int):Int = {| return a+b| } add: (a: Int, b: Int)Intscala> add(3,5) res1: Int = 8
方法的最后一句为返回值的话,可以将return 去掉, 如果一个方法体只有一句代码,大括号可以去掉。
scala> def times(x:Int,y:Int) = x * y times: (x: Int, y: Int)Intscala> times(3,5) res0: Int = 15
如果一个方法没有返回值,其返回类型为Unit , 并且“=”号可以去掉。
scala> def log(msg:String){| println(msg)| } log: (msg: String)Unitscala> log("测试") 测试
返回值的类型也可以通过智能推导来完成。
4.2 方法转函数的实现
在方法名后加上“ _ ” ,可以将方法转换成函数,如下代码,<function2>表示函数有2个参数,类型都是Int; 并且有 Int 返回值。在命令行中,系统会将转换好的函数赋值给res5 ; 可以通过res5调用该函数。
scala> add2 _
res5: (Int, Int) => Int = <function2>scala> res5(8,8)
res6: Int = 16
4.3 函数的定义
函数的定义可以在方法的基础上进行转换,比如下面代码介绍了函数和方法的定义:
## 方法的定义:def 方法名():ReturnType => {}
scala> def times(x:Int, y:Int) => x*y## 函数的定义: 去掉了def和方法名 这个代码块需要被别人调用,所以要用一个变量来引用。
scala> val times=(x:Int, y:Int) => x*y
times: (Int, Int) => Int = <function2>
在函数使用过程中,还有另一个常见的操作,就是将函数作为另一个函数的参数来使用,如下代码:
var money =100
def calMoneyLeft():Int = {println("函数参数调用中")money
}def cost(x: => Int){money -=50println("函数参数调用之前")println(x)
}cost(calMoneyLeft())
4.4 可变参数
对于Java来说,可变参数的声明的使用如下:
public class Test {public static void foo(String... args){}public static void bar(int... args){}//我们常见的main函数就是一个带有可变参数的函数public static void main(String... args){//可变参数在调用的时候可以传递一个或者多个参数,也可以不传递foo("Hello world","Hello Java");bar(1,2,3,4);bar();}
}
scala的可变参数与Java的差不多,只不过把 “…” 改为在类型后面加上“*” 使用如下:
object MultipleArguments {def main(args:Array[String]):Unit = {println("sum = "+calcSumWithQueue(1,3,5,9,7))}def calcSumWithQueue(numbers: Int*):Int = {var sum = 0for (element <- numbers){sum+= element}sum}}
可变参数的位置:
object MultipleArguments {//这种写法没毛病def foo(arg1: Int,arg2: Double*):Unit = { }//可变参数后面不能再出现其他参数//def foo2(arg1: Double*,arg2: Int):Unit = { }//不允许出现多个类型的可变参数//def foo3(arg1: Double*,arg2: Int*):Unit = { }//总结:一个函数中只能有一个可变参数,并且只能放在参数列表最后
}
可变参数的传参问题:
object MultipleArguments {def main(args: Array[String]): Unit = {//可变参数的实参为Range的时候,需要添加:_*来进行数据的转换println("sum = " + calcSumWithQueue(1 to 10: _*))//可变参数的实参为Array时,需要添加:_*来进行数据的转换val arr = Array("Hadoop", "Spark", "Storm")printArr(arr: _*)}def calcSumWithQueue(numbers: Int*): Int = {var sum = 0for (element <- numbers) {sum += element}sum}def printArr(arr: String*) {arr.foreach(ele => println(ele))}
}
4.5 参数的默认值
在函数声明的时候可以为参数设置默认值;在调用的时候将真实的值传递进去,也可以根据参数的名称进行传值:
object ArgWithDefaultVal {def main(args: Array[String]):Unit = {recordUser()recordUser("张三",1.65d)//在方法被调用的时候,指定要传入的参数名,这种叫做命名参数recordUser(height = 1.55d,name = "李四")}/** 用户信息的录入* */def recordUser(name: String="匿名",height: Double=1.70d):Unit = {println("录入用户记录 name:"+name+",height:"+height)}}
假如一个方法没有任何参数,那么在调用的时候,括号是可以去掉的。
Scala中的方法函数的定义相关推荐
- scala中命名参数函数_Scala中的命名参数和默认参数值
scala中命名参数函数 In this post, we are going to discuss the following two important concepts in Scala abo ...
- scala中命名参数函数_Scala中带有命名参数的函数
scala中命名参数函数 具有命名参数的函数 (Functions with named arguments ) A function is Scala can take multiple argum ...
- 6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: ```cpp struct stu
6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表:另一个将成绩低于某分数线的学生结点从链表中删除. 函数接口定义: struct stud_node *c ...
- scala中的filter函数
package mock /*** scala中常见的高阶函数* 这些高阶函数,都是作用在集合上面的* filter* map* flatMap* foreach* reduce* dropWhile ...
- 头文件中能否进行函数的定义
通常我们使用头文件时都是在头文件中进行声明,在源文件中定义,哪我们能否在头文件中进行函数的定义 我们先进行一个测试,先声明一个test.h和一个test.cpp文件,并且在test.h中定义一个函数和 ...
- odoo13中的模型类中的方法函数ORM方法以及模型方法的装饰器
1.模型类的方法函数(ORM方法) 方法 解释 create方法 记录创建方法.创建记录的orm函数. 页面新建点击保存时触发调用. 返回值为创建成功的记录集. write方法 记录更新方法.修改记录 ...
- C++运算符重载中有些方法为什么需要定义为友元函数
C++提供运算符重载主要目的: 希望对象之间的运算看起来可以和编译器内置类型一样丝滑: 相当于是告知编译器,类对象之间运算应该如何去做处理. 通过实现一个复数类,来阐述本文章的主题: class Co ...
- Scala 中 ensuring 方法的使用说明
Scala 在方法里除了可用 assert() 方法像 Java 那样进行断言,还可以使用 ensuring() 方法在返回结果的分支的花括号同一行上进行断言.它们不同的是 assert 可以随意放在 ...
- php5中魔术方法函数有哪几个,php中的类魔术方法有哪些
php中的类魔术方法有:1.__sleep,返回一个包含对象中所有应被序列化的变量名称的数组:2.__tostring,返回一个类被当作字符串时要输出的内容:3.__construct,构造方法:4. ...
- 关于Unity中变量和函数的定义
变量 1.匀速运动的物体都要记得定义一个speed速度变量 2.不断产生很多相同物体的事件要记得定义时间生成物体的间隔rate,并且有一个一达到rate的值就清0的累加时间变量,累加时间变量是通过Ti ...
最新文章
- 连续按back键盘退出自己的应用,杀掉进程
- JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
- JUC锁-框架与基本概念(一)
- 初步认识迭代服务器和并发服务器
- Python 执行 shell命令 的几个方法小结
- 看完动画你还敢说不会 快速排序
- 漫步数学分析二——欧几里得空间
- Xcode8 + Swift3.0 创建一个app基础框架
- java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
- iOS开发复制Label、textView内容是显示拷贝,不是copy
- linux设置自动清除内存碎片
- 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计 汉语言文学设计题材网页
- import mysql data to solr4.2.0
- 教你利用阿里云服务器搭建一个随时随地的Web IDE
- Settings学习总结(一)
- Codeforce 712A Memory and Crow
- 数据结构判断题30道含答案
- 优漫动游色彩搭配原则,如何巧妙的搭配色彩?
- 国内首个基于 Rust 语言的 RPC 框架 — Volo 正式开源!
- TDH sql及plsql的调优
热门文章
- 东大22春《马克思主义基本原理概论》在线平时作业1百分非答案
- Fabric 1.0源代码分析(39) policy(背书策略)
- 重装系统后计算机无法启动,Win7纯净版系统重装后无法开机的原因和解决方法...
- java 微信 图灵机器人_SAE服务下用java实现微信公众账号图灵机器人
- 几何畸变的类型_几何畸变分为()和()。
- 家乡的春节html,家乡的春节日记
- “黑暗潜伏者” -- 手机病毒新型攻击方式
- 如何解决MathType公式与文字不在同一行问题---已解决
- 我在b站上推荐一个看小电影的网站,结果被骂了
- 加推与多家上市企业合作,智能名片小程序为企业销售赋能