zoukankan      html  css  js  c++  java
  • Scala 基础(十):Scala 函数式编程(二)基础(二)

    1 过程

    将函数的返回类型为Unit的函数称之为过程(procedure),如果明确函数没有返回值,那么等号可以省略

     注意事项和细节说明

    1)注意区分: 如果函数声明时没有返回值类型,但是有 = 号,可以进行类型推断最后一行代码。这时这个函数实际是有返回值的,该函数并不是过程。

    2)开发工具的自动代码补全功能,虽然会自动加上Unit,但是考虑到Scala语言的简单,灵活,最好不加.

    2 惰性函数

    惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。

    惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。

    首先,您可以将耗时的计算推迟到绝对需要的时候。其次,您可以创造无限个集合,只要它们继续收到请求,就会继续提供元素。

    函数的惰性使用让您能够得到更高效的代码。Java 并没有为惰性提供原生支持,Scala提供了。

    Java实现懒加载的代码

    复制代码; "复制代码")

    public class LazyDemo { private String property; //属性也可能是一个数据库连接,文件等资源
    public String getProperty() { if (property == null) {//如果没有初始化过,那么进行初始化

    property = initProperty();

    } return property;
    } private String initProperty() { return "property";
    }
    } //比如常用的单例模式懒汉式实现时就使用了上面类似的思路实现

    复制代码; "复制代码")

    当函数返回值被声明为lazy时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。

    这种函数我们称之为惰性函数,在Java的某些框架代码中称之为懒加载(延迟加载)。

    注意事项和细节

    1)lazy 不能修饰 var 类型的变量

    2)不但是 在调用函数时,加了 lazy ,会导致函数的执行被推迟,我们在声明一个变量时,如果给声明了 lazy ,那么变量值得分配也会推迟。 比如 lazy val i = 10

     3 异常

    Scala异常处理举例

    复制代码; "复制代码")

    try {

      val r = 10 / 0 } catch { case ex: ArithmeticException=> println("捕获了除数为零的算数异常") case ex: Exception => println("捕获了异常")
    } finally { // 最终要执行的代码
      println("scala finally...")
    }
    

    复制代码; "复制代码")

    Scala异常处理小结

    1)我们将可疑代码封装在try块中。 在try块之后使用了一个catch处理程序来捕获异常。如果发生任何异常,catch处理程序将处理它,程序将不会异常终止。

    2)Scala的异常的工作机制和Java一样,但是Scala没有“checked(编译期)”异常,即Scala没有编译异常这个概念,异常都是在运行的时候捕获处理。

    3)用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,

    因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方

     4)在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case子句来匹配异常。

    【前面案例可以看出这个特点, 模式匹配我们后面详解】,当匹配上后 => 有多条语句可以换行写,类似 java 的 switch case x: 代码块..

    5)异常捕捉的机制与其他语言中一样,如果有异常发生,catch子句是按次序捕捉的。

    因此,在catch子句中,越具体的异常越要靠前,越普遍的异常越靠后,如果把越普遍的异常写在前,把具体的异常写在后,在scala中也不会报错,但这样是非常不好的编程风格。

    6)finally子句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作,这点和Java一样。

    7)Scala提供了throws关键字来声明异常。可以使用方法定义声明异常。 它向调用者函数提供了此方法可能引发此异常的信息。

    它有助于调用函数处理并将该代码包含在try-catch块中,以避免程序异常终止。在scala中,可以使用throws注释来声明异常

  • 相关阅读:
    HDU 5938 Four Operations 【贪心】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))
    HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5933 ArcSoft's Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))
    HDU 5929 Basic Data Structure 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
    【转】LaTeX 符号命令大全
    HDU 5922 Minimum’s Revenge 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
    HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
    数据结构之稀疏矩阵
    C++中引用(&)的用法和应用实例
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309049.html
Copyright © 2011-2022 走看看