本课程源码共享于 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学习系列(三)——入门与基础的更多相关文章

  1. Python学习系列(二)(基础知识)

    Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...

  2. scrapy爬虫学习系列三:scrapy部署到scrapyhub上

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  3. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  4. DocX开源WORD操作组件的学习系列三

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  5. RabbitMQ学习系列三-C#代码接收处理消息

    RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...

  6. .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

    原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能         接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...

  7. 1.Docker容器学习之新生入门必备基础知识

    0x00 Docker 快速入门 1.基础介绍 描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案: ...

  8. Identity Server4学习系列三

    1.简介 在Identity Server4学习系列一和Identity Server4学习系列二之令牌(Token)的概念的基础上,了解了Identity Server4的由来,以及令牌的相关知识, ...

  9. RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理

    上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...

  10. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

随机推荐

  1. c++中的多态机制

    目录 1  背景介绍 2  多态介绍 2-1  什么是多态 2-2  多态的分类 2-3  动态多态成立的条件 2-4  静态联编和动态联编 2-5  动态多态的实现原理    2-6   虚析构函数 ...

  2. [vijos1782]借教室<线段树>

      题目链接:https://vijos.org/p/1782 题意:一个区间1,n.m次操作,每次操作让l,r区间值减去d,当有任何一个值小于0就输出当前是第几个操作 这道题其实是没有什么难度的,是 ...

  3. Ubuntu+Hexo+Github搭建个人博客

    Ubuntu+Hexo+Github搭建个人博客 目录 目录 目录 1. 简介 环境 2. Git安装及配置 2.1 安装Git 2.2 创建Git仓库 2.3 配置git仓库 2.4 添加公钥 3. ...

  4. HTML 基础(六)

    一.脚本 JavaScript 是 HTML 页面具有更强的动态和交互性 <script> 标签 <script> 标签用于定义客户端脚本,<script> 元素既 ...

  5. Luogu 1008 三连击

    题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三 ...

  6. 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...

  7. 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)

    Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...

  8. 字符串学习笔记(三)---- StringBuilder

    一.前言 StringBuilder是jdk1.5后出现的,而StringBuffer是jdk1.0就出现了,并且在功能上俩者并无太大区别.但为什么后来要添加一个StringBuilder呢?这是为了 ...

  9. PTA | 1008 数组元素循环右移问题 (20分)

    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 ...

  10. python-nmap 使用基础

    前言 python-nmap是一个Python库,可帮助您使用nmap端口扫描程序.它可以轻松操纵nmap扫描结果,将是一个完美的选择想要自动执行扫描任务的系统管理员的工具和报告. 它还支持nmap脚 ...