Scala 基础

创建项目


  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 基础_第1张图片
Scala数据类型.jpeg
// 可以声明类型,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的子类,表示有值。

你可能感兴趣的:(Scala 基础)