Scala基础(一)

Scala入门

Scala特点

静态类型
	Scala的变量声明后不允许改变类型
	Scala所有变量和表达式的类型在编译时就已经完全确定
强类型
	一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型,也就是说不允许隐式类型转换
	Scala没有提供Java中的强制类型转换,取代方法有
		对象名.asInstanceOf[XXX]
		对象名.toXXX方法
		隐式转换(implicit关键字)
多范式编程
	-面向对象
		Scala中一切值都是对象
		Scala中去除了static关键字,使用一种特殊的对象来模拟类对象(伴生对象)
		Scala去除了接口的概念,引入特质概念
	-函数式编程
		Scala中一切函数都是值,所以可以将函数作为参数和返回值

常量与变量

val
	常量一旦初始化将不可以被修改
var
	变量可以重复赋值

类型推断

使用类型推断是必须指定变量初始值,否则无法进行类型推断

	var a		//错误定义方式
	val a:Int=_	//错误定义方式,因为val定义为常量

数据类型

	值类型(AnyVal)
		直接存储值,在栈上存储其值
		值类型与Java八大基本类型一致(byte、short、int、long、float、double、char、boolean)
		Byte、Short、Int、Long、Float、Double、Char、Boolean
	引用类型(AnyRef)
		存储对其值的引用,在栈上存储地址,在堆上存储值
		List、Option……
		YourClass
	字面量
		直接在代码中写常量值(constant value)的方式
			如整型字面量:0、0L、0xFF
			特别地:符号字面量:'<标识符>,对应“scala.Symbol”类型
	特殊类型
		Null
			scala.Null是所有引用类型的子类,仅一个实例对象“null”,并且“null”是关键字
		Nothing
			List()返回是List[Nothing]
		Unit
			仅有一个实例对象“()”,叫做无用占位符,类似于Java中的void类型,不同的是,在Java中void表示无返回值,但在Scala中,Unit表示有返回值,便是“()”,因为Scala认为一切表达式都有值

字符串插值器

	s字符串插值
		s"Hello, $name"等价于 StringContext("Hello, ", "").s(name)
		s" $name Hello,"等价于 StringContext( "","Hello, ").s(name)
		s"hi $name Hello,"等价于StringContext(" hi"," Hello,").s(name)
	f字符串插值
		可以进行格式化的输出,变量名后用%指定格式,如果没有指定,其作用和s是一样的
		val hei = 2.345
		println(f"The height is $hei%2.2f")
	raw插值
		让字符串原封原样的输出,屏蔽控制效果
		println(raw"/t/n")

本质是隐匿转换的实现

程序控制

条件控制

	任意表达式都有值,if语句也不例外
	val x=10
	val y=if(x==10) x+1 else "我是字符串"

循环控制

for(i<-1 to 5 if i%2==0;j<-1 to 5 if j%2!=0) println(s"$i+$j=${i+j}")
中断
	scala.util.control.Breaks中breakable()和break()函数
for推导式
	val j=for ( i: Int <- 1 to num; if i%2==0 ) yield i
	注意循环体必须以yield开头,多行语句使用yield{...}

块表达式

在 Scala 中,“ {} ”块包含一系列值表达式,其结果也是表达式。块中最后一个表达式的值就是块的值,即 “{} ”块的值取决于最后一个表达式

数据结构

数组

数组是可变的,但长度是固定的

元组

对应Tuple1~Tuple22共22个类
使用“()”快速创建相应元组
元组访问使用“_”,下标由1开始
元组不支持遍历(Traversable)
	for(i<-tp2.productIterator)println(i)

集合

  • Seq

      IndexSeq:索引序列
      	Vector、String、Range、ArrayBuffer
      	对于基于索引的操作来说效率较高,一般底层依赖于数组实现
      LinearSeq:线性序列
      	List、Stream、Stack、Queue、LinkedList
      	对于 head、tail,以及isEmpty一类的方法效率较高,一般底层依赖于链表实现
    
  • Set

      Set集合中的元素不允许重复(常用于去重)
      Set中的元素是无序的
      Set提供并、差、交集运算
    
  • Map

      类似Java中的哈希表,存储键值对
      var m=Map("a"->1)
      m += ("j"->0)	//新加一个键值对
      			“+=”操作后产生了一个新Map
      			将变量m改为val定义,即会报错
    
  • 可变与不可变

      	不可变:初始化后内容不再发生变化
      	可变:初始化后内容可以发生变化
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值