帝国阿3

导航

 

注:

本内容依赖相关参考资料以及本人理解,不保证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♪(・ω・)ノ

https://www.cnblogs.com/bigdatacaoyu

posted on 2019-05-25 13:34  帝国阿3  阅读(271)  评论(0编辑  收藏  举报