作者:林伟兵,叩丁狼高级讲师。本文为原创文章,转载请注明出处。 

4. 方法&函数的定义

在scala中,函数是一等公民,但是一般在开发中,函数和方法是可以相互代替的。

4.1 方法的定义

  1. 一个完整方法的定义如下

    scala> def add(a:Int, b:Int):Int = {| return a+b| }
    add: (a: Int, b: Int)Intscala> add(3,5)
    res1: Int = 8
    
  2. 方法的最后一句为返回值的话,可以将return 去掉, 如果一个方法体只有一句代码,大括号可以去掉。

    scala> def times(x:Int,y:Int) = x * y
    times: (x: Int, y: Int)Intscala> times(3,5)
    res0: Int = 15
    
  3. 如果一个方法没有返回值,其返回类型为Unit , 并且“=”号可以去掉。

    scala> def log(msg:String){| println(msg)| }
    log: (msg: String)Unitscala> log("测试")
    测试
    
  4. 返回值的类型也可以通过智能推导来完成。

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中的方法函数的定义相关推荐

  1. scala中命名参数函数_Scala中的命名参数和默认参数值

    scala中命名参数函数 In this post, we are going to discuss the following two important concepts in Scala abo ...

  2. scala中命名参数函数_Scala中带有命名参数的函数

    scala中命名参数函数 具有命名参数的函数 (Functions with named arguments ) A function is Scala can take multiple argum ...

  3. 6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: ```cpp struct stu

    6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表:另一个将成绩低于某分数线的学生结点从链表中删除. 函数接口定义: struct stud_node *c ...

  4. scala中的filter函数

    package mock /*** scala中常见的高阶函数* 这些高阶函数,都是作用在集合上面的* filter* map* flatMap* foreach* reduce* dropWhile ...

  5. 头文件中能否进行函数的定义

    通常我们使用头文件时都是在头文件中进行声明,在源文件中定义,哪我们能否在头文件中进行函数的定义 我们先进行一个测试,先声明一个test.h和一个test.cpp文件,并且在test.h中定义一个函数和 ...

  6. odoo13中的模型类中的方法函数ORM方法以及模型方法的装饰器

    1.模型类的方法函数(ORM方法) 方法 解释 create方法 记录创建方法.创建记录的orm函数. 页面新建点击保存时触发调用. 返回值为创建成功的记录集. write方法 记录更新方法.修改记录 ...

  7. C++运算符重载中有些方法为什么需要定义为友元函数

    C++提供运算符重载主要目的: 希望对象之间的运算看起来可以和编译器内置类型一样丝滑: 相当于是告知编译器,类对象之间运算应该如何去做处理. 通过实现一个复数类,来阐述本文章的主题: class Co ...

  8. Scala 中 ensuring 方法的使用说明

    Scala 在方法里除了可用 assert() 方法像 Java 那样进行断言,还可以使用 ensuring() 方法在返回结果的分支的花括号同一行上进行断言.它们不同的是 assert 可以随意放在 ...

  9. php5中魔术方法函数有哪几个,php中的类魔术方法有哪些

    php中的类魔术方法有:1.__sleep,返回一个包含对象中所有应被序列化的变量名称的数组:2.__tostring,返回一个类被当作字符串时要输出的内容:3.__construct,构造方法:4. ...

  10. 关于Unity中变量和函数的定义

    变量 1.匀速运动的物体都要记得定义一个speed速度变量 2.不断产生很多相同物体的事件要记得定义时间生成物体的间隔rate,并且有一个一达到rate的值就清0的累加时间变量,累加时间变量是通过Ti ...

最新文章

  1. 连续按back键盘退出自己的应用,杀掉进程
  2. JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
  3. JUC锁-框架与基本概念(一)
  4. 初步认识迭代服务器和并发服务器
  5. Python 执行 shell命令 的几个方法小结
  6. 看完动画你还敢说不会 快速排序
  7. 漫步数学分析二——欧几里得空间
  8. Xcode8 + Swift3.0 创建一个app基础框架
  9. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
  10. iOS开发复制Label、textView内容是显示拷贝,不是copy
  11. linux设置自动清除内存碎片
  12. 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计 汉语言文学设计题材网页
  13. import mysql data to solr4.2.0
  14. 教你利用阿里云服务器搭建一个随时随地的Web IDE
  15. Settings学习总结(一)
  16. Codeforce 712A Memory and Crow
  17. 数据结构判断题30道含答案
  18. 优漫动游色彩搭配原则,如何巧妙的搭配色彩?
  19. 国内首个基于 Rust 语言的 RPC 框架 — Volo 正式开源!
  20. TDH sql及plsql的调优

热门文章

  1. 东大22春《马克思主义基本原理概论》在线平时作业1百分非答案
  2. Fabric 1.0源代码分析(39) policy(背书策略)
  3. 重装系统后计算机无法启动,Win7纯净版系统重装后无法开机的原因和解决方法...
  4. java 微信 图灵机器人_SAE服务下用java实现微信公众账号图灵机器人
  5. 几何畸变的类型_几何畸变分为()和()。
  6. 家乡的春节html,家乡的春节日记
  7. “黑暗潜伏者” -- 手机病毒新型攻击方式
  8. 如何解决MathType公式与文字不在同一行问题---已解决
  9. 我在b站上推荐一个看小电影的网站,结果被骂了
  10. 加推与多家上市企业合作,智能名片小程序为企业销售赋能