Scala与Java差异(三)之函数
一、函数定义
(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差异(三)之函数相关推荐
- Scala与Java差异(四)之数组操作
一.数组操作之Array.ArrayBuffer以及遍历数组 (1)Array 在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组.此外,由于Scala与Java都是运行在J ...
- java对三次函数求导_如何画三次函数图像
问题 请绘制 的图形 思路一 借助软件 软件名称 介绍 geogebra image.png GeoGebra是自由且跨平台的动态数学软件,提供各级教育使用,包含了几何.代数.表格.图形.统计和微积分 ...
- java写三次函数导数,用导数研究三次函数
<用导数研究三次函数>由会员分享,可在线阅读,更多相关<用导数研究三次函数(14页珍藏版)>请在人人文库网上搜索. 1.用导数研究三次函数1. 知识点解析1.定义:定义1.形如 ...
- Scala与Java差异(二)之条件控制与循环
一.if表达式 (1)if表达式的定义 在Scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值. 例如,val age = 30; if (age > 18) 1 els ...
- Scala与Java差异(一)之基础语法
一.Scala解释器的使用 (1)REPL Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环). scala解释器也被称为REPL,会快 ...
- Scala与Java差异(六)之类定义
一.类定义 (1)定义类,包含field以及方法 class ScalaClass {private var field = "one"def aMethod() { print( ...
- Scala与Java差异(五)之Map与Tuple
一. 创建Map (1)创建Map // 创建一个不可变的Map val ages = Map("Leo" -> 30, "Jen" -> 25, ...
- Scala与Java语言的差异
1.源文件后缀名 Java:.java Scala:.scala 2.变量 Java: int param1 = 100; int param2 Scala: 格式: var VariableName ...
- scala和java的关键字对比
1.scala里面的Trait是接口的意思,java里面是关键词是interface //scala的接口trait Htt {def Htt (name:String)} //java的接口 Int ...
最新文章
- xpwin7下的CMD命令
- Java8-Stream 概括
- css中flex布局
- 【PC工具】github项目辅助下载工具,github高速下载
- 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑
- java if和else if的区别_关于C语言中if,elseif和else的区别在哪里
- 【kafka】已解决 kafka No current assignment for partition
- java 二维数组内存溢出_程序员:学习心得,Java内存区域,内存溢出异常
- Java二叉查找树最简单实现
- MySQL随机函数的运用场景示例总结
- 基于c语言实现的TCP连网斗地主程序(一)
- 华为计算机系统叫什么,华为MateBook操作系统是什么
- 大数据技术原理与应用之可视化实训
- Xshell和Xftp使用(非商业用途可以免费使用啦)
- 使用AKO为TKG提供LoadBalancer
- 用c语言写个简单的电话薄
- mybatis(三) XML映射器之select、update、delete、insert标签
- Wireshark协议分析之DHCP
- Java学习路线·入门
- 计算机应用系统统考配书光盘,统考配书光盘计算机应用基础使用手册
热门文章
- html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
- 从像素坐标到相机坐标_鱼眼相机模型EUCM(一)
- [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value
- [剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列
- android中弹出窗口,如何在Android中创建弹出窗口(PopupWindow)
- python如何引用txt_如何使用pip requirements.txt文件安装python模块附加组件
- 算法---会议最大安排问题
- Java Web之filter、listener、Interceptor
- Tarjan缩点/边双/点双
- 快速沃尔什变换:从入门到背板(含推导过程)