1. Scala 的面向对象

在学习 Java 的时候,我们说 Java 是一门面向对象的语言,然而 Java 其实并没有完全遵守“一切皆对象”这一准则。

例如:Java 的8种基本数据类型 & Java 的数组。

但是 Scala 相比而言,是一门更加纯粹的面向对象的语言,因为它完全遵守“一切皆对象”。

2. 数组 Array

Scala 中定义了数组对象 scala.Array。

我们可以这么初始化一个数组对象:

val array = new Array[String](3)

它的类型是 Array[String],所以也可以这么定义(不使用类型推断)

val array: Array[String] = new Array[String](3)

如果需要在创建和初始化数组的同时,对其中所有的元素进行赋值,也可以这么做:

val array = Array("1", "2", "3")

这么做从语法上看,可能会有点奇怪,但是它会在编译时调用 Array 伴生对象里一个 apply() 的工厂方法,所以其实质是:

val array = Array.apply("1", "2", "3")

Scala 中使用圆括号 () 而不是方括号[] 来调用数组中的元素:

for (i <- 0 to 2) println(array(i))

这么做的原因也是为了契合 Scala 面向对象的特点,它本质上是调用 Array 对象的 apply() 方法:

for (i <- 0 to 2) println(array.apply(i))

Scala 的数组允许更新其中的元素内容:

array(0) = "0"

它本质上是调用 Array 对象的 update() 方法:

array.update(0, "0")

由此可见,Scala 数组是一个拥有相同类型对象的可变序列,虽然无法在数组实例化之后改变其长度,但是可以改变元素值,所以 Array 是一个可变对象

3. 列表 List

与数组相对,列表 List 是一个拥有相同类型,即不可改变其长度,又不可改变其元素值得数据结构。

Scala 的 List 与 Java 的 List 不同,它是一个不可变对象

所以 List 必须在初始化的同时,将 List 里面所有的元素同时完成初始化:

val list = List(1, 2)

val list = List.apply(1, 2) // 与上面等价

由于是不可变对象,List 只能读取不可修改,读取方式和 Array 相同:

for (i <- 0 to 1) println(list(i))
for (i <- 0 to 1) println(list.apply(i)) // 与上面等价

列表 List 支持 :: 和 ::: 操作符来对列表进行拼接。

(Scala 支持使用纯操作符,来作为函数的名字,而这个操作符如果以 : 结尾,那么就认为是右操作元方法,即函数的调用发生在操作符的右侧对象上,反之则是左操作元方法)

双冒号操作符方法,用于在列表最前面添加一个新的元素,返回新的列表:

val list2 = 0 :: list // 结果是 List(0, 1, 2)
val list2 = list.::(0) // 与上面等价

三冒号操作符方法,用于拼接两个列表,返回新的列表:

val list1 = List(1, 2)
val list2 = List(3, 4)
val list3 = list1 ::: list2 // 结果是 List(1, 2, 3, 4)
val list3 = list2.:::(list1) // 与上面等价

空列表用 Nil 表示,通过巧妙地使用 Nil,增加了新的创建列表 List 对象的方式:

val list = 1 :: 2 :: Nil // 结果是 List(1, 2)

4. 元组 Tuple

Array 和 List 都是只能存储同一种数据类型,元组 Tuple 支持存储不同的数据类型。

元组是不可变对象

元组只有一种初始化方式:

val pair = (1, "Two", Array(1, 2), List("one"))
val pair = Tuple4.apply(1, "Two", Array(1, 2), List("one")) // 与上面等价

Scala 源码中,根据元组的长度,创建了22个对象,从 Tuple1 到 Tuple22。

访问元组元素的方法,是通过英文句点. & 下划线_ & 从1开始的序号:

println(pair._1)
println(pair._2)
  • 之所以不能使用类似 pair(1) 来访问元素,是因为 apply() 方法在元组中,不能确定结果类型。
  • 之所以从下标1开始访问元组的元素,是为了兼容其他支持元组的语言的使用习惯。

5. 集 Set

与 Java 类似, Scala 中提供集 Set 来存储同一类型、不含重复元素的集合。

Scala 提供了两种集,可变集 scala.collection.mutable.Set 和不可变集  scala.collection.immutable.Set。

其中,不可变集在没有 import 的情况下,为默认实现。

这里的可变性在于:Set 的长度可变,但是每一个元素指向的内容还是不可变的。

集 Set 的初始化方式:

val set = Set("1", "23", "1")
val set = Set.apply("1", "23", "1") // 与上面等价

集 Set 不能通过下标来读取里面的内容,其默认的 apply() 方法的作用是判断入参是否存在于集对象中:

set("1") // 返回 true

如果需要读取 Set 中的元素,需要用到迭代器:

set.foreach(s => println(s))

可以使用 += 来为 Set 添加新的元素

var set = Set("1", "23", "1") // 这里必须定义成 var,因为是不可变 Set
set += "33"
val set = scala.collection.mutable.Set("1", "23", "1")
set += "33"

6. 映射 Map

Map 映射用来存储两个对象之间的映射关系。

和 Set 相同,Scala 提供了可变映射 scala.collection.mutable.Map 和不可变映射  scala.collection.immutable.Map,不可变映射为默认实现。

映射 Map 的初始化方式,通过 -> 表达映射关系:

val map = Map(1 -> "1", 2 -> "2")

通过 += 操作符为 Map 添加映射关系:

var map = Map(1 -> "1", 2 -> "2") // 因为不可变 Map,所以必须是 var
map += 1 -> "0"

如果 添加的 key 值相同,后者会取代前者,例如下面的例子输出就是0:

var map = Map(1 -> "1", 2 -> "2")
map += 1 -> "0"
println(map.apply(1))

Scala 基础(2)—— 基本数据结构的更多相关文章

  1. (数据科学学习手札45)Scala基础知识

    一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...

  2. 第一章 Scala基础篇

    目录 一.Scala基础语法 (一) 变量.类型.操作符 1.变量申明 2.字符串 3.数据类型 4.操作符 (二)循环判断 1.块表达式 2.条件表达式 3.循环表达式 (三)方法和函数 1.方法 ...

  3. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  4. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  5. Scala基础(1)

    Scala基础语法 声明与定义: val,常量声明                       val  x:T(把x声明成一个类型为T的常量)  x是变量的名字,T是变量的类型          v ...

  6. scala 基础知识总结

    在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...

  7. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  8. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

  9. Scala 基础(7)—— 函数字面量和一等函数

    1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...

  10. Scala 基础(5)—— 构建函数式对象

    有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...

随机推荐

  1. runtime - 消息机制

    Xcode中使用runtime代码时,建议先做下配置: 使用runtime代码时会有适当的提醒. OC方法调用的本质是消息转发,消息机制的本质 创建一个Person类,添加方法 - (void)eat ...

  2. SQL递归查询实现组织机构树

    系统用到的组织机构树,要实现对当前节点以及其子节点的查询,数据库SQL要用到递归查询,这也是我第一次接触SQL的递归查询. 先说一下什么是递归查询,简单说来是将一个树状结构存储在一张表里,比如一个表中 ...

  3. 【期望dp 质因数分解】cf1139D. Steps to One

    有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...

  4. CCS选择器基础

    上周学习了HTML和css的一些基础,今天来夯实一下基础 选择器有: 1.标签选择器 :就是HTML 中的标签 如<p> <h1> <body>等 2.类选择器: ...

  5. Maven - 依赖范围<scope></scope>

    6种:

  6. 执行pip命令时遇到 Fatal error in launcher: Unable to create process using '"'

    电脑同时安装了python-2.7.13跟python-3.6.1,安装时勾选了pip,环境变量也已经配置好. 为了方便运行,同时修改了可执行文件为 python2和python3.此时在cmd命令行 ...

  7. Thinkphp 取消Url默认模块的现实

    例子http://www.tp.com/home/index/index 想要现实的效果是:http://www.tp.com/index/index 1是通过配置路由来达到目的 2通过配置首页的入口 ...

  8. 深入理解restfulAPI和 Oauth2.0(精简版)

    一.restfulAPI 1.解释: restfulAPI协议,我们也可以说是一套API接口编写风格. 它被现在很多企业所认可和默认,是一套成俗的API接口编写方案. 2.restfulAPI之资源 ...

  9. python系列3之内置函数和文件操作

    目录 自定义函数 内置函数 文件的操作 练习题 一. 自定义函数 1. 函数的创建 函数的创建 1.def关键字 2.函数名+() 3.冒号 4.缩进 5. return返回值,可以不写,默认的返回值 ...

  10. 机器学习实战 -- 决策树(ID3)

    机器学习实战 -- 决策树(ID3)   ID3是什么我也不知道,不急,知道他是干什么的就行   ID3是最经典最基础的一种决策树算法,他会将每一个特征都设为决策节点,有时候,一个数据集中,某些特征属 ...