注:
本内容依赖相关参考资料以及本人理解,不保证100%正确,仅供参考
欢迎大家指出错误之处,一同交流、学习。
参考资料:
上一篇:Scala (一):Scala简介和HelloWorld
一:声明值和变量
Scala有两种类型的变量:
- val:不可变,相当于常量,在声明的时候必须初始化,且初始化后不可再赋值
- var:可变,变量,在声明的时候需要进行初始化,初始化后可以对其再次赋值
Scala有自动类型推导,如:
系统自动推断出来变量myStr 为字符串模式(String类来自java.lang.String Scala直接使用java的定义,未自己定义此数据结构)
同时我们也可以显式的指定类型:
var myStr: String = "I love Scala!" var myStr2: java.lang.String = "I'm string class from java" // Scala 的 String类是直接使用的java String类
其中 : 分隔了变量名和类型,和java不同,scala是变量名在前,类型在后,并以:分隔,这里要注意
其它,例:
二:基本数据类型和操作
数据类型:
- Scala的数据类型包括:Byte, Char, Short, Int, Long, Float, Double和Boolean
- 和Java不同的是,这些类型都是“类”,并且都是包scala的成员。比如Int的全名是scala.Int 。对于字符串,Scala用的是java.lang.String类来表示字符串
参考:
字面量 literal
通常我们还有一个术语,字面量(英文literal)
字面量通俗的来说就是值
如下图
我们后面会说字面量,字面量对于我们理解Scala中的函数有很大帮助,这里大家先知道,字面量是什么
操作符:
scala有: + - * / % 等操作符,在scala中,操作符就是方法。例如: 5 + 3 和 5.+(3) 是等价的,也就是说:
a 方法 b 等价于: a.方法(b)
前者是后者的简写形式,+是方法名,如示例的5.+(3),+是Int类中的一个方法
Scala没有提供++ 和 -- 的操作符,如果需要递增或者递减的时候,可以 使用 += 或者 -=, 比如
var x = 1 x += 1
富包装类:
-
对于基本数据类型,除了上述提到的各种操作符外,Scala还提供了了其他常用运算的方法,只是这些方法不在基本的类中提供,而是被封装到了一个富包装类中(富裕的包装类)
-
每个基本类型都有一个对应的富包装类,例如Int有一个RichInt类、String有RichString类,这些类位于包:scala.runtime中
-
当对数据类型的对象调用其富包装类提供的方法,Scala会自动隐式转换将该对象转换成对应富包装类的对象,用以使用相应的方法,如:Int类中没有提供max方法,如果我们键入:3 max 5 会自动转换成RichInt类执行操作,因为max方法定义在RichInt
-
富包装类是对基础类的包装,富是富裕的意思,表示比基础类提供更多的方法
Range:
在使用for循环的时候我们经常会使用的数组序列,比如,x的值从1到10,我们可以采用Range实现
Range可以创建不同数据类型的数值序列,包括Int,Long,Double,Char,BigInt,BigDecimal等
步长:创建range的时候可以指定步长(相邻两个元素之差)
示例:
创建一个1到10的序列,步长为1
scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range 1 to 10 scala> res0.toBuffer res1: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
如上代码,1 to 10 会创建一个 range
调用toBuffer,可以显示内容为1, 2, 3, 4, 5, 6, 7, 8, 9, 10
res0,是scala shell中对于匿名对象的调用名称,每创建一个匿名(无名称)对象后,shell都会默认给出一个名称resx 其中x 从0开始递增,步长1
不指定步长,步长默认为1
创建一个步长为2 的序列
scala> 1 to 10 by 2 res2: scala.collection.immutable.Range = inexact Range 1 to 10 by 2 scala> res2.toBuffer res3: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 3, 5, 7, 9)
如上代码,by关键字用来指定步长
这样我们得到了一个步长为2 的 1 ~ 10 的序列
因为步长为2 所以最终得到的range是 1, 3, 5, 7 ,9
创建一个Float类型的序列,从0.5f 到11.5f , 步长0.3f
scala> 0.5f to 11.5f by 0.3f <console>:12: warning: method to in trait FractionalProxy is deprecated (since 2.12.6): use BigDecimal range instead 0.5f to 11.5f by 0.3f ^ res0: scala.collection.immutable.NumericRange[Float] = NumericRange 0.5 to 11.5 by 0.3 scala> res0.toBuffer res1: scala.collection.mutable.Buffer[Float] = ArrayBuffer(0.5, 0.8, 1.1, 1.4000001, 1.7, 2.0, 2.3000002, 2.6000001, 2.9, 3.2, 3.5, 3.8000002, 4.1000004, 4.4, 4.7000003, 5.0, 5.3, 5.6000004, 5.9, 6.2000003, 6.5, 6.8, 7.1000004, 7.4, 7.7000003, 8.0, 8.3, 8.6, 8.900001, 9.200001, 9.5, 9.8, 10.1, 10.400001, 10.700001, 11.0, 11.3)
这里给出的警告是让我们使用BigDecimal来产生range,我们后面会说BigDecimal
欢迎转载,欢迎提出意见
如果本文对您有帮助,还请点击一下推荐哦,Thanks♪(・ω・)ノ