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

本课程源码共享于 https://github.com/tree1123/learning-scala
首先,打开IDEA编辑器的SbtExampleProject项目,我们将在这个项目下进行练习
本节的练习内容位于 com.tree1123.Base 中 新建一个main函数

一 、声明值和变量
Scala声明变量有两种方式,一个用val,一个用var
声明格式为: val/var 变量名【:变量类型】 = 变量值
val定义的值是不可变的 类似于一个常量
IDEA的快捷键 Enter + Alt 方便给出提示, 我们这样增加变量类型, 便于初学时 , 清楚看到scala的类型推断

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

val类型是常量

var类型是变量

注意: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等,为基本类型提供了更多的有用操作。

scala的toString其实就是由Predef中的隐式转换完成将相应类型转换成Rich*,然后调用Rich*的相对应方法.
在scala中通过方法进行类型转换,不像Java的强制类型转换。

注意:Scala中没有强制转换 需要通过方法进行类型的转换
Scala中所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。
统一类型,是Scala的一大特点。而且Scala还定义了几个底层类(Bottom Class),比如Null和Nothing。

1)Null是所有引用类型的子类型,而Nothing是所有类型的子类型。Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型,但是不能赋值给值类型。
2)Nothing,可以作为没有正常返回值的方法的返回类型,直观的说明这个方法不会正常返回。而且由于Nothing是其他任意类型的子类,他还能跟要求返回值得方法兼容。
3)Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义。
三、算术和操作符
一个运算符是一个符号,用于告诉编译器来执行指定的数学运算和逻辑运算。
Scala 含有丰富的内置运算符,包括以下几种类型:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
算术运算符
下表列出了 Scala 支持的算术运算符。
假定变量 A 为 10,B 为 20:

关系运算符
下表列出了 Scala 支持的关系运算符。
假定变量 A 为 10,B 为 20:

逻辑运算符
下表列出了 Scala 支持的逻辑运算符。
假定变量 A 为 1,B 为 0:

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

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

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

注意:scala的算术操作可以完成和Java中相同的工作,但是有一点区别,他们都是方法。
Scala中没有 ++ --操作符 需要通过+= -=

四、Scala几个特性
Scala除了方法,还提供了函数
调用函数 需要引入函数包 import 包名._ 下划线_是通配符 等同于java中的*

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 空字符串的等方式来表示缺少某个值的做法。

Scala学习系列(三)——入门与基础的更多相关文章
- Python学习系列(二)(基础知识)
Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- DocX开源WORD操作组件的学习系列三
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能 接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...
- 1.Docker容器学习之新生入门必备基础知识
0x00 Docker 快速入门 1.基础介绍 描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案: ...
- Identity Server4学习系列三
1.简介 在Identity Server4学习系列一和Identity Server4学习系列二之令牌(Token)的概念的基础上,了解了Identity Server4的由来,以及令牌的相关知识, ...
- RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...
- C# Redis学习系列三:Redis配置主从
Redis配置主从 主IP :端口 192.168.0.103 6666 从IP:端口 192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...
随机推荐
- 分布式配置中心Apollo
1,什么是分布式配置中心 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做 ...
- Make编译Ardupilot源码的两种方法
编译环境准备 Ardupilot源码下载和PX4 toolchain工具链下载 (见https://www.cnblogs.com/BlogsOfLei/p/7707485.html) 注 ...
- 火焰图--记一次cpu降温过程
引子 正值周末,娃儿6:30又如闹铃般准时来叫醒了我们.年前离开美菜,又回到了杭州.原本是想有更多时间陪伴娃儿,然而新的工作节奏与工作地点,让我们每天都是早上见面:这不,为了周末可以多玩一会儿,早早就 ...
- memcached-tool 工具
perl memcached-tool server_ip:port stats 输出说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的uni ...
- A 皮呵德
时间限制 : 5000 MS 空间限制 : 262144 KB 问题描述 Eyiz正在与邪恶的Dgdon战斗. 为了打败Dgdon,Eyiz决定召唤PhantasmDragon来帮助他. 但是,召 ...
- 牛客寒假基础集训营 | Day1 E-rin和快速迭代(暴力 + 优化)
E-rin和快速迭代 题目描述 rin最近喜欢上了数论. 然而数论实在太复杂了,她只能研究一些简单的问题. 这天,她在研究正整数因子个数的时候,想到了一个"快速迭代"算法.设 f( ...
- docker搭建可视化portainer
一.在docker中查询portainer # docker search portainer 二.下载portainer # docker pull portainer/portainer 三.运行 ...
- 1066 Root of AVL Tree (25分)(AVL树的实现)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- Vulnhub DC-3靶机渗透
修改错误配置 打开了ova文件会发现,怎么也找不到DC-3的ip地址,估计是网卡出了问题. 那么就先配置下网卡. 进入上面这个页面之前按e. 将这里的ro 替换为 rw signie init=/bi ...
- Google GMS介绍
Google GMS介绍GMS全称为GoogleMobile Service.GMS目前提供有Search.Search by Voice.Gmail.Contact Sync.Calendar Sy ...