前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala学习系列(三)——入门与基础

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

作者头像
大数据流动
发布2020-04-30 16:24:00
4850
发布2020-04-30 16:24:00
举报
文章被收录于专栏:实时计算实时计算
file
file

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

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

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

file
file

一 、声明值和变量

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

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

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

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

file
file

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

file
file

val类型是常量

file
file

var类型是变量

file
file

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

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

代码语言:javascript
复制
	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
file

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

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

file
file

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

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

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

file
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
file
关系运算符

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

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

file
file
逻辑运算符

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

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

file
file
位运算符

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

file
file

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

file
file
赋值运算符

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

file
file

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

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

file
file

四、Scala几个特性

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

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

file
file

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

代码语言:javascript
复制
 BigInt.probablePrime(100,scala.util.Random)

调用对象方法

代码语言:javascript
复制
"Hello".distinct

apply,update方法

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

代码语言:javascript
复制
//下边两者等同
"Hello"(4)
"Hello".apply(4)
//下边两者等同
Array(1,2,3)
Array.apply(1,2,3)

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

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

代码语言:javascript
复制
//两者等同
var arr = Array(1,2,3)
    arr(2)=5
    arr.update(2,5)

option类型

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 、声明值和变量
  • 二、常用类型
  • 三、算术和操作符
  • 四、Scala几个特性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档