一、函数定义

(1)函数的定义与调用

在Scala中定义函数时,需要定义函数的函数名、参数、函数体。

第一个函数如下所示:

def sayHello(name: String, age: Int) = {if (age > 18) { printf("hi %s, you are a big boy\n", name); age }else { printf("hi %s, you are a little boy\n", name); age}sayHello("leo", 30)

Scala要求必须给出所有参数的类型,但是不一定给出函数返回值的类型,只要右侧的函数体中不包含递归的语句,Scala就可以自己根据右侧的表达式推断出返回类型。

 (2)在代码块中定义包含多行语句的函数体

单行的函数:def sayHello(name: String) = print("Hello, " + name)

如果函数体中有多行代码,则可以使用代码块的方式包裹多行代码,代码块中最后一行的返回值就是整个函数的返回值。与Java中不同,不是使用return返回值的。

比如如下的函数,实现累加的功能:

def sum(n: Int) = {var sum = 0;for(i <- 1 to n) sum += isum
}

(3)递归函数与返回类型

如果在函数体内递归调用函数自身,则必须手动给出函数的返回类型。

例如,实现经典的斐波那契数列:

9 + 8; 8 + 7 + 7 + 6; 7 + 6 + 6 + 5 + 6 + 5 + 5 + 4; ....

def fab(n: Int): Int = {if(n <= 1) 1else fab(n - 1) + fab(n - 2)}

二、函数的默认参数和带名参数

(1) 默认参数

在Scala中,有时我们调用某些函数时,不希望给出参数的具体值,而希望使用参数自身默认的值,此时就定义在定义函数时使用默认参数。

def sayHello(firstName: String, middleName: String = "William", lastName: String = "Croft") = firstName + " " + middleName + " " + lastName 

如果给出的参数不够,则会从作往右依次应用参数。

(2)Java与Scala实现默认参数的区别

Java:

public void sayHello(String name, int age) {if(name == null) {name = "defaultName"}if(age == 0) {age = 18}}sayHello(null, 0)

Scala:

def sayHello(name: String, age: Int = 20) {print("Hello, " + name + ", your age is " + age)}sayHello("leo")

(3)带名参数

在调用函数时,也可以不按照函数定义的参数顺序来传递参数,而是使用带名参数的方式来传递。

sayHello(firstName = "Mick", lastName = "Nina", middleName = "Jack") 

还可以混合使用未命名参数和带名参数,但是未命名参数必须排在带名参数前面。

sayHello("Mick", lastName = "Nina", middleName = "Jack")

三、函数的变长参数

(1)变长参数

在Scala中,有时我们需要将函数定义为参数个数可变的形式,则此时可以使用变长参数定义函数。

def sum(nums: Int*) = {var res = 0for (num <- nums) res += numres}sum(1, 2, 3, 4, 5)

(2)使用序列调用变长参数

在如果想要将一个已有的序列直接调用变长参数函数,是不对的。比如val s = sum(1 to 5)。此时需要使用Scala特殊的语法将参数定义为序列,让Scala解释器能够识别。这种语法非常有用!一定要好好注意,在spark的源码中大量地使用到了。

val s = sum(1 to 5: _*)

案例:使用递归函数实现累加

def sum2(nums: Int*): Int = {if (nums.length == 0) 0else nums.head + sum2(nums.tail: _*)

四、函数的过程、lazy值和异常

(1)过程

在Scala中,定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。

过程还有一种写法,就是将函数的返回值类型定义为Unit。

def sayHello(name: String) = "Hello, " + namedef sayHello(name: String) { print("Hello, " + name); "Hello, " + name }def sayHello(name: String): Unit = "Hello, " + name

(2)lazy值

在Scala中,提供了lazy值的特性,也就是说,如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会发生计算。这种特性对于特别耗时的计算操作特别有用,比如打开文件进行IO,进行网络IO等。

import scala.io.Source._lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

即使文件不存在,也不会报错,只有第一个使用变量时会报错,证明了表达式计算的lazy特性。

val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkStringlazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkStringdef lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

(3) 异常

在Scala中,异常处理和捕获机制与Java是非常相似的。

try {throw new IllegalArgumentException("x should not be negative")} catch {case _: IllegalArgumentException => println("Illegal Argument!")} finally {print("release resources!")}
try {throw new IOException("user defined exception")} catch {case e1: IllegalArgumentException => println("illegal argument")case e2: IOException => println("io exception")}

Scala与Java差异(三)之函数相关推荐

  1. Scala与Java差异(四)之数组操作

    一.数组操作之Array.ArrayBuffer以及遍历数组 (1)Array 在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组.此外,由于Scala与Java都是运行在J ...

  2. java对三次函数求导_如何画三次函数图像

    问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...

  3. java写三次函数导数,用导数研究三次函数

    <用导数研究三次函数>由会员分享,可在线阅读,更多相关<用导数研究三次函数(14页珍藏版)>请在人人文库网上搜索. 1.用导数研究三次函数1. 知识点解析1.定义:定义1.形如 ...

  4. Scala与Java差异(二)之条件控制与循环

    一.if表达式 (1)if表达式的定义 在Scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值. 例如,val age = 30; if (age > 18) 1 els ...

  5. Scala与Java差异(一)之基础语法

    一.Scala解释器的使用 (1)REPL Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环). scala解释器也被称为REPL,会快 ...

  6. Scala与Java差异(六)之类定义

    一.类定义 (1)定义类,包含field以及方法 class ScalaClass {private var field = "one"def aMethod() { print( ...

  7. Scala与Java差异(五)之Map与Tuple

    一. 创建Map (1)创建Map // 创建一个不可变的Map val ages = Map("Leo" -> 30, "Jen" -> 25, ...

  8. Scala与Java语言的差异

    1.源文件后缀名 Java:.java Scala:.scala 2.变量 Java: int param1 = 100; int param2 Scala: 格式: var VariableName ...

  9. scala和java的关键字对比

    1.scala里面的Trait是接口的意思,java里面是关键词是interface //scala的接口trait Htt {def Htt (name:String)} //java的接口 Int ...

最新文章

  1. xpwin7下的CMD命令
  2. Java8-Stream 概括
  3. css中flex布局
  4. 【PC工具】github项目辅助下载工具,github高速下载
  5. 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑
  6. java if和else if的区别_关于C语言中if,elseif和else的区别在哪里
  7. 【kafka】已解决 kafka No current assignment for partition
  8. java 二维数组内存溢出_程序员:学习心得,Java内存区域,内存溢出异常
  9. Java二叉查找树最简单实现
  10. MySQL随机函数的运用场景示例总结
  11. 基于c语言实现的TCP连网斗地主程序(一)
  12. 华为计算机系统叫什么,华为MateBook操作系统是什么
  13. 大数据技术原理与应用之可视化实训
  14. Xshell和Xftp使用(非商业用途可以免费使用啦)
  15. 使用AKO为TKG提供LoadBalancer
  16. 用c语言写个简单的电话薄
  17. mybatis(三) XML映射器之select、update、delete、insert标签
  18. Wireshark协议分析之DHCP
  19. Java学习路线·入门
  20. 计算机应用系统统考配书光盘,统考配书光盘计算机应用基础使用手册

热门文章

  1. html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
  2. 从像素坐标到相机坐标_鱼眼相机模型EUCM(一)
  3. [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
  4. [剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列
  5. android中弹出窗口,如何在Android中创建弹出窗口(PopupWindow)
  6. python如何引用txt_如何使用pip requirements.txt文件安装python模块附加组件
  7. 算法---会议最大安排问题
  8. Java Web之filter、listener、Interceptor
  9. Tarjan缩点/边双/点双
  10. 快速沃尔什变换:从入门到背板(含推导过程)