创建项目
4.0.0
org.baozi
scala-learning
1.0
2.11.8
org.scala-lang
scala-library
${scala.version}
src/main/scala
src/test/scala
org.scala-tools
maven-scala-plugin
2.15.0
compile
testCompile
启动应用程序
// 1.通过main方法
object Hello {
def main(args: Array[String]): Unit = {
println("Hello")
}
}
// 2.也可以通过继承App
object Hello extends App{
println("Hello")
}
数据类型
// 可以声明类型,Scala也会自动推断类型
// Byte|Char|String|Short|Int|Long|Float|Double|Boolean
val myByte: Byte = 1
val myChar: Char = 'a'
val myString: String = "ABC"
val myShort: Short = 1
val myInt: Int = 1
val myLong: Long = 1
val myFloat: Float = 1.0F // 加f/F
val myDouble: Double = 1.0
val myBoolean: Boolean = true
// Any : 所有类的父类
// Nothing: 所有类的子类
// val myAny: Any = 任何值
// val myNothing: Nothing = 不知道怎么赋值,也不知道怎么用
// AnyVal: 所有值类型 的父类
// AnyRef: 所有引用类型的父类
// Null : 所有引用类的子类,null
val myAnyVal: AnyVal = 1
val myAnyRef: AnyRef = "1"
val myNull: Null = null
// Unit: void返回值,只有一个实例值()
val myUnit: Unit = ()
类型转换 & 判断类型
10.asInstanceOf[Double] // 转换类型: 10.0
10.isInstanceOf[Int] // 类型判断: true
字符串高级操作
// 字符串
val str = "ABC"
val strs =
"""
|A
|B
|C
""".stripMargin
println(str) // ABC
println(strs) // A
// B
// C
// 字符串引用变量
val name = "baozi"
val strName = s"name: $name"
val strsName =
s"""
|name: $name
|name: $name
""".stripMargin
println(strName) // name: baozi
println(strsName) // name: baozi
// name: baozi
条件表达式
val predicate = 1
// 1. if else
if (predicate > 0) true else false
// 2. 将结果赋值给变量
val res1 = if (predicate > 0) true else false
// 3. if else if else
if (predicate < 0) {
println("<0")
} else if (predicate == 0) {
println("=0")
} else {
println(">0")
}
循环表达式
// for -----------------
for (num <- 1 to 10) {
println(num)
}
for (str <- Array("A", "B", "C", "D", "E")){
println(str)
}
for (num <- 1 to 10 if num%2 == 0; if num < 10) {
println(num)
}
val res = for (i <- 1 to 10 if i < 5 ) yield (i * 2)
println(res)
// foreach -----------------
(1 to 10).foreach(num => println(num))
1.to(10).foreach(num => println(num))
1.to(10).foreach(println)
// while -----------------
// var num = 100
// var sum = 0
var (num, sum) = (100, 0)
while (num > 0) {
sum += num
num = num - 1
}
println(sum)
使用函数
// 1 + 2 改成方法调用=> 1.+(2)
// Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
1 to 10
1.to(10)
// Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
1 until 10
1.until(10)
// (小, 大, +step), (大, 小, -step)
Range(1, 10) // Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1, 10, 1) // Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1, 10, 2) // Range(1, 3, 5, 7, 9)
Range(10, 1, -1) // Range(10, 9, 8, 7, 6, 5, 4, 3, 2)
Range(10, 1, -2) // Range(10, 8, 6, 4, 2)
Scala关键字
sealed: 禁止在该文件以外声明子类
Scala操作符
def sum(nums: Int*): Int = {
if (nums.isEmpty){
0
} else {
// nums.tail返回的是Seq[Int], 使用:_*转成符合方法参数的形式(例如:1,2,3,4....
nums.head + sum(nums.tail:_*)
}
}
call-by-value和call-by-name
def myFunc(): Int ={
println("计算值...")
42
}
// call-by-value: 调用函数之前就计算
/*
计算值...
1: 42
2: 42
*/
def callByValue(x: Int): Unit = {
println("1: " + x)
println("2: " + x)
}
// call-by-name: 用到时才计算
/*
计算值...
1: 42
计算值...
2: 42
*/
def callByName(x: => Int): Unit = {
println("1: " + x)
println("2: " + x)
}
// 调用
callByValue(myFunc())
callByName(myFunc())
Null Nil None Nothing的区别
Null:表示空引用,所有引用类的子类
Nil:表示空List
Nothing:所有类的子类
None:Option的子类,表示无值; Option用作返回值; Some也是Option的子类,表示有值。