一、Scala的var和val
package com.ccj.pxj.varOrval
object VarDemo {
val girlFriend = "小白"
def main(args: Array[String]): Unit = {
var name: String = "smith"
var age: Int = 10
var gender: Char = '男'
var isPass: Boolean = true
var sal: Float = 8907.4f
var num1 = 100 //就使用到了类型推断
//在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变,val 修饰的变量不可改
//因为val 是线程安全的,因此效率高,scala推荐使用
//即能够使用val ,就不要使用var
//var 是可以变的。
var lover = "小红"
lover = "小黑"
//val 是不可变的变量
// val girlFriend = "小白"
println(girlFriend)
//girlFriend = "小黄"
}
}
val修饰的变量在编译后,等同于加上final
var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等)
val 是线程安全的,因此效率高,scala推荐使用,能够使用val ,就不要使用var
二、数据类型
-
Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型
-
Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型), 注意:不管是AnyVal还是AnyRef 都是对象。
对上面的数据类型的关系图的说明 -
Any是所有类的根类型,即所有类的父类(基类)
-
在scala中类分为两个大的类型分支(AnyVal [值类型,即可以理解成就是java的基本数据类型], AnyRef类型)
-
在AnyVal 虽然叫值类型,但是仍然是类(对象)
-
在scala中有两个特别的类型(Null ), 还有一个是Nothing
-
Null 类型只有一个实例 null, 他是bottom class ,是AnyRef的子类.
Nothing 类型是所有类的子类, 它的价值是在于因为它是所有类的子类,就可以将Nothing类型的对象返回给任意的变量或者方法
6) 在scala中仍然遵守 低精度的数据自动的转成 高精度的数据类型。
7)在scala中,Unit 类型比较特殊,这个类型也只有一个实例 ()
三、强制类型转换
package com.ccj.pxj.varOrval
object DataTypeTrans {
def main(args: Array[String]): Unit = {
val b:Byte=10
val c:Short=12
val d:Char='a'
val e:Double=1.025
println(d.toInt)
println(e.toInt)
println(d+b+c)
}
}
-
当进行数据的 从 大——>小,就需要使用到强制转换,注意有精度的损失 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
-
Char类型可以保存 Int的常量值,但不能保存Int的变量值,需要强转
-
Byte和Short类型在进行运算时,当做Int类型处理。
三、键盘输入
package com.ccj.pxj.varOrval
import scala.io.StdIn
object InputDemo {
def main(args: Array[String]): Unit = {
val name = StdIn.readLine()
println("name=" + name)
}
}
四、程序流程控制
package com.ccj.pxj.varOrval
object IfElseDemo {
def main(args: Array[String]): Unit = {
val year=2020
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
println(s"year= ${year} 是闰年")
}
}
}
五、循环
package com.ccj.pxj.varOrval
object ForDemo {
def main(args: Array[String]): Unit = {
for(r<- 1 to 30){
println(r)
}
}
}
package com.ccj.pxj.varOrval
object UntilDemo {
def main(args: Array[String]): Unit = {
for(l<- 1 until(10)){
println(l)
}
println("--------加守卫条件-----------------")
for(k<-1 to 3 if k!=2){
println(k)
}
var list=List("pxj","wfy","cdr","ccj","lzh")
for (l<-list if ! l.contains("cdr")){
println(l)
}
}
}
println("-------------")
for(i<-1 to 10;j<-1 to 5 ){
println(s"i: ${i},j:${j}")
}
说明:
to是前闭后闭
until是前闭后开
循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为true则进入循环体内部,为false则跳过,类似于continue
yield关键字使用
将遍历过程中处理的结果返回到一个新Vector集合中,使用yield关键字,yield 可以写代码块.
package com.ccj.pxj.varOrval
object UntilDemo {
def main(args: Array[String]): Unit = {
for(l<- 1 until(10)){
println(l)
}
println("-------------------------")
for(k<-1 to 3 if k!=2){
println(k)
}
println("--------------------------------------------------------------------------")
var list=List("pxj","wfy","cdr","ccj","lzh")
for (l<-list if ! l.contains("cdr")){
println(l)
}
println("-------------")
for(i<-1 to 10;j<-1 to 5 ){
println(s"i: ${i},j:${j}")
}
println("------------------------------------------------------------------------------------")
val seqs= for (i <- 1 to 10) yield i * 2
println(seqs)
val datas = for (i <- 1 to 100 if i % 2 == 1) yield {
i
}
println(datas)
}
}
作者:pxj(潘陈)
日期:2020-02-07 凌晨2:01:40
我不爱学习,不要刺激我