1. 变量定义与初始化
package com.lineshen.chapter2
object variable {
def main(args: Array[String]): Unit = {
val age: Int = 10
val sal: Double = 10.9
val name: String = "lienshen"
val isPass: Boolean = true
val score: Float = 99.55f
println(s"${name} ${age} ${score} ${sal}")
}
}
变量类型可以写可以不写,与golang不同的是,定义类型用 [:type];
当然,scala支持变量类型的推导;
变量申请时,请注意初始化,这一点与java很不同;
val修饰的变量编译之后等于加上了final,保证线程安全;
类型判断与Java一样用 variableName.theInstanceof[variableType];
2.数据类型
Scala与Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说Scala没有java中的原生类型。
Scala的数据类型分为两大类:AnyVal(值类型)和AnyRef(引用类型),注意:不管是AnyVal还是AnyRef都是对象。因此,他有大量的方法可以直接调用。
package com.lineshen.chapter2
object removePara {
def main(args: Array[String]): Unit = {
sayHi()
sayHi
}
def sayHi() : Unit ={
println("Hi, scala")
}
}
>>Hi, scala
>>Hi, scala
当函数没有形参时,函数的调用可以免去括号(),真的很神奇!
小结:
1. 在Scala中有一个根类Any,是所有数据类型的父类
2. Null类型是scala的特别数据类型,只有一个值null;他是bottom class,是所有anyRef类型的子类
3. Nothing类型也是bottom class,它是所有数据类型对应类的子类,一般抛出异常时最常使用。
4. Scala中低精度向高精度的值自动隐式转换
5. Unit表示无值,与其它语言中的void 等同,用作不反悔任何结果的方法的结果类型。Unit只是一个实例值,写成();
package com.lineshen.chapter2
object nothingCTest {
def main(args: Array[String]): Unit = {
sayHello
}
// 异常中断:即当我们nothing作为返回值,就明确说明该方法没有正常返回值
def sayHello() :Nothing = {
throw new Exception("抛出异常")
}
}
val floatVal : Float = 1.1 // 错误:Double无法向Float转换
val doubleVal = 1.2f //正确:Float可以向Double转换
3. 基本数据类型与String之间的转换
// 基本数据类型 -> String
val temp :Int = 1024
val str = temp + ""
// String -> 基本数据类型
str.toInt()
str.toFloat()
str.toDouble()
str.toByte()
4. 分支与循环
package com.lineshen.chapter4
import scala.io.StdIn
object ifelseDemo {
def main(args: Array[String]): Unit = {
println("your name:")
val name = StdIn.readLine()
if (name == "lienshen")
println("hello " + name)
else
println("you are " + name)
}
}
在scala中没有swich多分支设计,采用模板match-case,功能十分强大。
关于for循环,变动很大,成为for推导式。
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
for(i <- 1 to 5) {
println("hello, Tsinghua University " + i)
}
}
}
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
for (i <- list) {
println(i)
}
}
}
循环守卫,也叫循环保护式。类似于continue,不过scala把continue干掉了(实质是把for循环与判断偶合在了一起,简化代码)
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
for (i <- list if i == "lineshen") {
println(i)
}
}
}
for引入新变量(实质是for循环与遍历变量的耦合)
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
for (i <- list; j = i + " i love you") {
println(j)
}
}
}
for简化循环嵌套(实质是简画代码长度,但是不好写业务逻辑)
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list_i = List("hello", "tsinghua", "hello", "lineshen")
val list_j = List(" happy")
for (i <- list_i; j <- list_j) {
println(i+j)
}
}
}
for循环返回值yield (遍历过程中把结果保存在Vector中,并返回到变量中);主要用于集合中的数据单元处理
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
val res = for (i <- list) yield i
println(res)
}
}
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
val res = for (i <- list) yield if (i == "lineshen") i + " happy"
println(res)
}
}
>> List((), (), (), lineshen happy)
for循环的步长控制(可以用守卫,可以用range)
package com.lineshen.chapter4
object forDemo {
def main(args: Array[String]): Unit = {
// 支持对集合的遍历,和for range很像
val list = List("hello", "tsinghua", "hello", "lineshen")
val res = for (i <- Range(0,3,2)) yield list(i)
println(res)
}
}
>> Vector(hello, hello)
for循环不支持break关键字,同样采用循环守卫进行处理。
Scala提供了while循环,但是不支持采用while循环。