返回介绍

数学基础

统计学习

深度学习

工具

Scala

一、Scala 特点

发布于 2023-07-17 23:38:23 字数 6914 浏览 0 评论 0 收藏 0

  1. 可以从https://docs.scala-lang.org/api/all.html 查询scala doc 文档。

  2. Scala 允许添加新的数据类型,这些新加的类型用起来和内建的类型一样。

    Scala 也允许添加新的控制结构,其用法也和内建的控制结构一样。

1.1 面向对象&函数式

  1. Scala 同时支持面向对象编程和函数式编程。

  2. Scala 中,一切value 都是对象,每个操作都是方法调用。如:+ 都是方法调用,1+2 实际上是调用了Int 类定义的、一个叫做+ 的方法。

    • Scala 不同,Java/C++ 中的基本数据类型都不是对象,在这些语言中允许不是对象的value 存在。
    • Scala 不同,Java/C++ 中允许不以任何对象的成员形式存在的静态字段和静态方法。

    另外,在Scala 中可以定义名字像操作符的方法,这样就可以用操作符表示法来调用。如:obj ! msg! 就是自定义的一个方法的名字。

    而且,Scala 中函数就是对象,函数的类型是一个可以被继承的类,函数本身就是这个类的对象。

  3. 函数式编程有两大核心理念:

    • 函数是一等公民,其地位与整数、字符串等相同。

      • 可以将函数作为参数传递给其它函数,也可以返回函数作为某个函数的返回值,也可以将函数保存在变量里。
      • 可以在函数中定义另一个函数,就像在函数中定义整数一样。
      • 可以在定义函数时不指定名字,这称作函数字面量,就像整数字面量10 一样。

      Scala 不同,Java/C/C++ 中的函数是二等公民。

    • 程序中的操作应该将输入值映射成输出值,而不是原地修改数据。即:方法调用不应该产生副作用,方法只能通过接收入参、返回结果这两种方式与外部环境通信。

  4. 不可变数据结构是函数式编程的基础之一,Scala 类库在 Java API 的基础上定义了更多的不可变数据类型。如:不可变列表、不可变元组、不可变set、不可变map

    函数式编程鼓励采用不可变数据结构和referential transparent 的方法。referential transparent 方法指的是:对任何给定的输入,该方法调用都可以直接被其结果替换,同时不会影响程序的语义。如:c=f(a),假设f(a) 的结果是100,则该语句用 c=100 替换不会对程序有任何影响。

1.2 Scala 优势

  1. ScalaJava 高度兼容。Scala 运行在标准的 Java 平台上,可以和所有 Java 类库无缝协作:

    • Scala 程序会被编译成JVM 字节码,因此Scala 程序运行期性能通常与Java 程序相差无几。

    • Scala 代码可以调用Java 方法、访问Java 字段、从Java 类继承、实现Java 接口。这并不需要任何特殊的语法或者额外的代码。

    • Scala 重度复用了Java 的数据类型。如:

      • ScalaInt 是用Java 的基本类型int 实现的。
      • ScalaFloat 是用Java 的基本类型float 实现的。
      • ScalaBoolean 是用Java 的基本类型boolean 实现的。
      • Scala 的数组被映射成Java 的数组。
      • Scala 的字符串字面量是一个java.lang.String
      • Scala 抛出的异常必须是java.lang.Throwable 的子类。

      基本上所有的Java 基本数据类型在Scala 包中都有对应的类,当Scala 代码编译成Java 字节码时,Scala 编译器会尽量使用Java 基本数据类型从而达到更优的性能。

    • 也可以在Java 中调用Scala 的代码。但是由于ScalaJava 表达能力更为丰富,因此Scala 某些高级特性需要经过加工之后才能映射到Java

  2. Scala 程序通常都很短。与Java 相比,Scala 代码行数可以相差一个量级。更少的代码不仅意味着更少的打字,也意味着更少的bug 和更容易阅读与理解。

    Scala 更少的代码归因于以下几点:

    • Scala 语法避免了Java 程序中的一些样板代码boilerplate 。如:Scala 中分号是可选的,通常大家也不写分号。
    • Scala 代码支持类型推断,因此冗余的类型信息可以去掉,这使得代码更为紧凑。
    • Scala 提供了大量工具来定义功能强大的类库,使得代码更加精炼。
  3. Scala 是静态类型的,它拥有非常先进的静态类型系统。

    • Scala 通过类型推断避免了代码中到处是类型声明,从而导致代码过于罗嗦的问题。
    • Scala 通过模式匹配、创建新类型、类型组合的方式灵活的使用类型。

    静态类型系统的优点:

    • 可以证明某些运行期错误不可能发生。

      • 虽然这种保障比较简单,但这是真正的保障,不是单元测试所能提供的。
      • 静态类型系统不能代替单元测试,但是它可以减少单元测试的数量。
    • 可以安全的对代码进行重构。

    • 静态类型系统是程序化的文档,编译器会检查其正确性。

1.3 语法风格

  1. Scala 的注释风格与Java 相同:行内注释 //,行间注释/*....*/

  2. Scala 推荐的代码缩进风格是:每个层级缩进2 个空格。

  3. Scala 的包和Java 的包很类似,它们都将全局命名空间划分为多个区域,提供了信息隐藏的机制。

  4. Scala 命令行参数可以通过args 数组获取,数组下标从0 开始。

    • 0 个参数是真正的命令行参数,而不是脚本文件名。
    • Scala 数组的索引是圆括号args(0),这与Java 不同(Javaargs[0] )。
  5. Scala 中,每条语句最后的分号通常是可选的:如果当前行只有一条语句,则分号不是必须的;如果当前行有多条语句,则分号是必须的。

    
    val s1="hello" ; println(s1) // 必须有分号
    println("world") // 不必有分号
    • 如果一条语句跨越多行,则大多数情况下直接换行即可,Scala 会自动断句:

      
      
      xxxxxxxxxx
      if (x<2) println("1") else println("2")

      但是有时候会产生意外的效果:

      
      
      xxxxxxxxxx
      x +y

      会被解析成两条语句x+y。如果希望编译器解析成单条语句x+y ,则有两种做法:

      • 使用圆括号:

        
        
        xxxxxxxxxx
        (x +y)
      • + 放到行尾。当使用中缀操作符(如+)来串接表达式时,Scala 风格是将操作符放到行尾:

        
        
        xxxxxxxxxx
        x + y
    • 分号推断规则:除非以下任意一条为true,否则代码行的末尾就被当作分号处理:

      • 当前行以一个不能作为语句结尾的词结尾,如:英文句点.,中缀操作符。
      • 下一行以一个不能作为语句开头的词开头。
      • 当前行的行尾出现在圆括号() 或者方括号[] 内,因为圆括号、方括号不能包含多条语句。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文