Scala第四天——函数入门之过程、懒值及异常


本文部分参考自:https://blog.csdn.net/dataiyangu/article/details/98190098


Scala第四天——函数入门

自己的话:漆黑的黑夜 表示着威胁 我选择诙谐

工作在堆叠 没兑现归结于那些理解

函数入门之过程、懒值及异常


一、过程

1.简述:

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

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

def sayHello(name: String) = "Hello, " + name
def sayHello(name: String) { print("Hello, " + name); "Hello, " + name }
def sayHello(name: String): Unit = "Hello, " + name
2.详解:

我们将不返回值得函数叫做过程,返回类型是 Unit,他是没有=号的。

def
  box(s : String) { // Look carefully: no =
val border = "-" * s.length + "--\n"
println("\n" + border + "|" + s + "|\n" + border)
}

或者直接可以定义:

def
  box(s : String) : Unit = { // Look carefully: no = val border = "-" * s.length + "--\n"
println("\n" + border + "|" + s + "|\n" + border)
}
3.实例:

在这里插入图片描述


二、懒值(lazy值)

1.简介:

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

2.详解:

当 val 被声明为 lazy 时,他的初始化将被推迟,直到我们首次对此取值。 懒值使用注意:

(1)用于初始化开销比较大的语句。
(2)可以解决循环依赖问题。
依赖循环是先有鸡还是先有蛋的问题,假如有两个对象A和B,A的初始化用到了B,B的初始化用到了A,将其中的一个设置为lazy就可以解决问题了。因为进行初始化A的时候B其实已经初始化好了
(3)是开发懒数据结构的基础。

在声明的时候是不去初始化的,当你用到它的时候它才会去初始化

3.实例:

(1)

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").mkString
lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
def lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

(2)
在这里插入图片描述

可以看到,这里看到这里只有在真正的用到的时候采取调用了init方法。


三、异常

1.简述:

当碰到异常情况时,方法抛出一个异常,终止方法本身的执行,异常传 递到其调用者,调用者可以处理该异常,也可以升级到它的调用者。运行系 统会一直这样升级异常,直到有调用者能处理它。 如果一直没有处理,则终 止整个程序。

Scala 的异常的工作机制和 Java 一样,但是 Scala 没有“受检”异常,你 不需要声明说函数或者方法可能会抛出某种异常。受检异常在编译器被检 查,java 必须声明方法所会抛出的异常类型。

什么叫受检异常,在java中如果一个方法报了异常,他在调用方法的时候这个方法也要进行捕获,或者就会不合法,需要加try catch,但是在scala中是没有的

2.详解:

(1)抛出异常:用 throw 关键字,抛出一个异常对象。所有异常都是 Throwable 的子类型。throw 表达式是有类型的,就是 Nothing,因为 Nothing 是所有类型的子类型,所以 throw 表达式可以用在需要类型的地方

//并不像 Java 代码那样,需要声明方法会抛出异常,这给程序员省去理论很多烦恼。 def divide(x: Int, y: Int): Int = {
   if (y == 0) throw new Exception("Divide by zero")
else x / y }

(2)捕捉异常:
在 Scala 里,借用了模式匹配的思想来做异常的匹配,因此,在 catch 的 代码里,是一系列 case 字句。

异常捕捉的机制与其他语言中一样,如果有异常发生,catch 字句是按次 序捕捉的。因此,在 catch 字句中,越具体的异常越要靠前,越普遍的异常越 靠后。 如果抛出的异常不在 catch 字句中,该异常则无法处理,会被升级到 调用者处。

异常捕获通常采用模式匹配的语法:

try
{
process(in)
} catch {
case ex: IOException => println(ex)
} finally {
  in.close()}

(3)finally 字句用于执行不管是正常处理还是有异常发生时都需要执行的步 骤,一般用于对象的清理工作。

注:Throw 的类型为 Nothing,存在 exception 的 if 语句类型返回类型。


让优秀成为习惯


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值