• Scala学习系列(三)——入门与基础


    file

    本课程源码共享于 https://github.com/tree1123/learning-scala

    首先,打开IDEA编辑器的SbtExampleProject项目,我们将在这个项目下进行练习

    本节的练习内容位于 com.tree1123.Base 中 新建一个main函数

    file

    一 、声明值和变量

    Scala声明变量有两种方式,一个用val,一个用var

    声明格式为: val/var 变量名【:变量类型】 = 变量值

    val定义的值是不可变的 类似于一个常量

    IDEA的快捷键 Enter + Alt 方便给出提示, 我们这样增加变量类型, 便于初学时 , 清楚看到scala的类型推断

    file

    熟练以后 我们可以将变量类型省略

    file

    val类型是常量

    file

    var类型是变量

    file

    注意:var和val关键字只标识引用本身是否可以指向另一个不同的对象,它们并未表明其所引用的对象是否可变。为了减少可变性引起的bug,应该尽可能的使用不可变变量。

    变量类型可以省略,解析器会根据值进行推断。val和var声明变量时都必须初始化。

    	object Base {
    
      def main(args: Array[String]): Unit = {
    
        //使用val定义的变量值是不可变的,相当于java里用final修饰的变量
        val aaa: Int = 4 * 2
    
        //aaa = 10
        //使用var定义的变量是可变的,在Scala中鼓励使用val
        //变量名在前,类型在后
        var bbb: Int = 4 * 2
        bbb = 10
      }
    
    }
    

    二、常用类型

    Scala有8种数据类型,和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型

    • Boolean:true或者false

    • Byte:8位,有符号

    • Short:16位,有符号

    • Int:32位,有符号

    • Long:64位,有符号

    • Char:16位,无符号

    • Float:32位,单精度浮点数

    • Double:64位,双精度浮点数

    跟java的数据类型不同,Scala不区分基本类型和引用类型,所以这些类型都是对象,可以调用相对应的方法,String直接使用的是 java.lang.String 不过由于String实际是一系列Char的不可变的集合,Scala中大部分针对集合的操作都可以用于String,具体来说,String的这些方法存在于类scala.collection.immutable.StringOps中。由于String在需要时能隐式转换为StringOps,因此不需要任何额外的转换,String就可以使用这些方法。

    每一种数据类型都有对应的Rich*类型,如RichInt,RichChar等,为基本类型提供了更多的有用操作。

    file

    scala的toString其实就是由Predef中的隐式转换完成将相应类型转换成Rich*,然后调用Rich*的相对应方法.

    在scala中通过方法进行类型转换,不像Java的强制类型转换。

    file

    注意:Scala中没有强制转换 需要通过方法进行类型的转换

    Scala中所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。

    统一类型,是Scala的一大特点。而且Scala还定义了几个底层类(Bottom Class),比如Null和Nothing。

    file

    1)Null是所有引用类型的子类型,而Nothing是所有类型的子类型。Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型,但是不能赋值给值类型。

    2)Nothing,可以作为没有正常返回值的方法的返回类型,直观的说明这个方法不会正常返回。而且由于Nothing是其他任意类型的子类,他还能跟要求返回值得方法兼容。

    3)Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义。

    三、算术和操作符

    一个运算符是一个符号,用于告诉编译器来执行指定的数学运算和逻辑运算。

    Scala 含有丰富的内置运算符,包括以下几种类型:

    • 算术运算符

    • 关系运算符

    • 逻辑运算符

    • 位运算符

    • 赋值运算符

      算术运算符

      下表列出了 Scala 支持的算术运算符。

      假定变量 A 为 10,B 为 20:

    file

    关系运算符

    下表列出了 Scala 支持的关系运算符。

    假定变量 A 为 10,B 为 20:

    file

    逻辑运算符

    下表列出了 Scala 支持的逻辑运算符。

    假定变量 A 为 1,B 为 0:

    file

    位运算符

    位运算符用来对二进制位进行操作,~,&,|,^分别为取反,按位与与,按位与或,按位与异或运算,如下表实例:

    file

    Scala 中的按位运算法则如下:

    file

    赋值运算符

    以下列出了 Scala 语言支持的赋值运算符:

    file

    注意:scala的算术操作可以完成和Java中相同的工作,但是有一点区别,他们都是方法。

    Scala中没有 ++ --操作符 需要通过+= -=

    file

    四、Scala几个特性

    Scala除了方法,还提供了函数

    调用函数 需要引入函数包 import 包名._ 下划线_是通配符 等同于java中的*

    file

    Scala中没有静态方法,一般通过单例对象或者伴生对象进行实现

     BigInt.probablePrime(100,scala.util.Random)
    

    调用对象方法

    "Hello".distinct
    

    apply,update方法

    apply是调用时可以省略方法名的方法,用于构造和获取元素

    //下边两者等同
    "Hello"(4)
    "Hello".apply(4)
    //下边两者等同
    Array(1,2,3)
    Array.apply(1,2,3)
    

    在StringOps中会发现一个def apply(n:Int):Char的方法定义

    update方法也是调用时可以省略方法名的方法,用于元素的更新

    //两者等同
    var arr = Array(1,2,3)
        arr(2)=5
        arr.update(2,5)
    

    option类型

    Scala为单个值提供了对象的包装器,表示那种可能存在也可能不存在的值。只有两个子类对象,Some表示某个值 另外一个None 表示为空 通过Option的使用 避免了使用null 空字符串的等方式来表示缺少某个值的做法。

  • 相关阅读:
    mysql-workbench-community报错解决办法
    前端技术交流群
    h5页面在浏览器上好好的,到手机上熄火了又看不到报错信息怎么办?
    【面试篇】金九银十面试季,这些面试题你都会了吗?
    [译]8个惊人的HTML按钮悬停效果,不看后悔一辈子
    'Component' is defined but never used
    DNS协议
    HTTP协议
    套接字Socket
    GYM102219H Are You Safe?(凸包)
  • 原文地址:https://www.cnblogs.com/tree1123/p/12779001.html
Copyright © 2020-2023  润新知