scala基础概念------入门级

一、什么是Scala以及特点

Scala是一种面向对象的函数式编程语言
特点:
 1. 静态类型
 	scala的变量声明不允许改变类型,即所有变量和表达式的类型在编译时就已经完全确定,这种类型的语言可以使IDE可以更好的感知代码,使开发更有效率,可读性较好

 2. 强类型
 	它是一种强类型的语言,这意味着Scala是类型安全的语言
	Scala没有提供Java中的强制类型转换,但是替代的有方法:

	==对象名.asInstanceOf[T]  把对象转换为T的实例==
	==注意和对象名.isInstanceOf[T]的区别(判断对象是否为T的实例)==

	对象名.toXXX方法
	隐式转换(implict)关键字

 3. 面向对象编程
	与Java相比,Scala去除了static关键字,类是一个抽象的概念,对象是类的实例,是一个具体的概念,代替的是使用伴生类和伴生对象来声明和调用静态内容
	Scala去除了接口的概念,代替的是对象的类型和行为由类和特质来描述

 4. 函数式编程
	Scala中一切函数都是值,所以可以将函数作为参数和返回值,这样更容易编写多并发和多线程的应用

二、Scala变量与常量

1. 变量和常量定义的关键字分别为var和val
区别:常量是指不可变的变量,变量是指可变变量
	 常量一旦初始化不可被修改,但如果常量是引用类型,则可以更改属性
2. 类型推断
前提:指定变量初始值
若不想赋值,则可以用下划线"_"
	val a:Int = _

三、Scala数据类型

在这里插入图片描述

1. 总体上:值类型(AnyVal)和引用类型(AnyRef)
值类型包括Byte、Short、Int 、Long 、Float 、Double 、Char 、Boolean、Unit
引用类型包括String等其他非值类型
区别:值类型直接存储值,在栈上存储其值
	 引用类型存储其对值的引用,在栈上存储地址,在栈上存储值
比较地址 a1.eq(b1)
比较值  a1 == b1
与Java相反

2.Null和Nothing
Null是所有引用类型的子类
Nothing是所有类型的子类,也是Null的子类
理解:Null是一个对象,例如指没有水的杯子,而Nothing指水和杯子都没有
Null除了比较操作,其他操作都是非常,容易空指针异常

四、Scala程序控制

  1. if表达式的类型判断
val x = 10
val y = if(x == 10) x+1 else "我是字符串"
解释:y的类型是Int和String的公共父类型,Int的父类是AnyVal,String的父类是AnyRef,而它们的父类是Any,所以y是Any类型

val y = if(x== 10) x+1 else true
如果if后面没有跟else,则默认else部分的值是Unit即"()"
  1. 交互式解释器(REPL)
REPL默认只能解释一行语句,但是if语句通常是多行组成的,所以在REPL中使用“:Paste”结合“Ctrl+D”完成
  1. 块表达式
{}”块包含一系列值表达式,“{}”的值取决于最后一个表达式
1)赋值语句的值为Unit类型
2)创建代码块时即创建了一个作用域,在代码块内可以访问代码块外的实体(变量、函数、类),反之不成立。
  1. for循环基本用法
1for循环基本结构
for(i <- 表达式){
	statements
}
注意:1 to n: 返回 1 到 n 的区间,包含 n
	 1 until n: 返回 1 到 n 的区间,不包含 n
	 1 to 10 by 2:返回 Range(1, 3, 5, 7, 9)
	 1 until 10 by 2:返回 Range(1, 3, 5, 7, 9)

2)条件过滤
简化格式:for ( i: Int <- 1 to num if i%2==0) println( i * 100 )
更多守卫:for ( i: Int <- 1 to num if i%2==0; if i>2) println( i * 100 )
注:if语句“()”可选

多生成器i <- 表达式
for{ i<-1 to 5 if i%2==0; j<-1 to 5 if j%2!=0 } println(s"$i+$j=${i+j}")

3breakable()跳出循环,
import scala.util.control.Breaks._ //注意先导入
breakable { //调用 breakable()函数,op:=>Unit 表示无参函数
 	for (i <- 1 to 10) {
 		if (i == 5) {
 			break() //调用 break()函数
		 }
 		println(i)
 } }

4for推导式
for循环以yield开始,则会构造一个集合,每次迭代生成集合中的一个,与第一个生成器兼容

五、Scala数据结构

Scala数据结构强调了是可变(mutable)还是不可变的(immutable),默认情况下,会选择不可变的数据结构。差别:
不可变:初始化后内容不再发生变化
可变:初始化后内容可以发生变化
1. 数组
数组内容是可变的,但区分为可边长和不可变长数组
可边长数组ArrayBuffer需要导包
import scala.collection.mutable.ArrayBuffer
2. 元组
元组最多允许存储22个不同类型的元素,除了Tuple1其他的都可以用“()”快速创建相应元组
元组访问使用“_”,下标由1开始
元组不支持遍历,如要遍历,需使用元组的productIterator()函数产生Iterator对象
元组是不可变的
3. 集合
集合分三大类:Seq、Set和Map,顶层为Traversable.这是一个特质
1)Seq序列
Seq分为可变和不可变序列,还有IndexSeq和LinearSeq两个特质
IndexedSeq代表索引序列,基于索引的操作效率较高
LinearSeq代表线性序列,head、tail之类的方法效率较高
Vector是一个带索引的不可变序列容器
2)Set集合
Set与List类似,主要特点:
不允许重复(去重)
无序
提供并、差、交集运算
3)Map映射
Map存储键值对,它也是一个不可变Map
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值