Scala基礎語法

if表達式的定義:在Scala中,if表達式是有值的,就是if或者else表達式中最後一行語句的返回值。java

object IfDemo {
    def main(args: Array[String]): Unit = {
        val age = 28
        val isAdult = if (age > 25) 1 else 0
        println(isAdult)
    }
}

if表達式的類型推斷:因爲if表達式是有值的,Scala會自動對返回值的類型進行推斷,取if和else表達式的值類型的公共父類型。好比if表達式的值類型是Int,else表達式的值類型是Unit,也用()表示,則表達式的值類型是Any。這裏,Any是Int和Unit的公共類型。網絡

while do循環:Scala有while do循環,基本語義與Java相同。函數

object Demo {
    def main(args: Array[String]): Unit = {
        var n = 20 // 定義變量
        while(n > 0) {
            println(n)
            n -= 1
        }
    }
}

Scala沒有for循環,只能使用while替代for循環,或者使用簡易版的for語句spa

簡易版的for語句:scala

object Demo {
    def main(args: Array[String]): Unit = {
        val n = 20 // 定義變量
        for (i <- 1 to n) {
            println(i)
        }
    }
}

Scala跳出循環語句:Scala沒有提供相似於java的break語句,可是可使用boolean變量、return或Breaks的break函數來替代使用。code

import scala.util.control.Breaks._

object Demo {
    def main(args: Array[String]): Unit = {
        breakable {
            var n = 10
            for(c <- "Hello World") {
                if(n == 5) {
                    break
                }
                print(c)
                n -= 1
            }
        }
    }
}

Scala之九九乘法表blog

object Demo {
    def main(args: Array[String]): Unit = {
        for (i <- 1 to 9; j <- 1 to i) {
            print(i + "*" + j + "=" + (i * j) + "\t")
            if (i == j) {
                println()
            }
        }
    }
}

if守衛:取偶數遞歸

object Demo {
    def main(args: Array[String]): Unit = {
        for (i <- 1 to 20 if i % 2 == 0) {
            println(i + "是偶數.")
        }
    }
}

for推導式:構造集合it

object Demo {
    def main(args: Array[String]): Unit = {
        val newValue: Seq[Int] = for (i <- 1 to 10) yield {
            i * 2
        }
        println(newValue)
    }
}

Scala函數:在Scala中定義函數時,須要定義函數的函數名、參數、函數體。Scala要求必須給出全部參數的類型,可是不必定給出函數返回值的類型,只要右側的函數體中不包含遞歸的語句,Scala就能夠本身根據右側的表達式推斷出返回類型。io

函數定義:def 函數名(參數1:參數類型1,參數2:參數類型2...)[:返回值類型]={函數體}

舉例:

def sum(n: Int) = {
  var sum = 0for(i <- 1 to n) sum += i
  sum
}

遞歸函數與返回類型:若是在函數體內遞歸調用函數自身則必須手動給出函數的返回類型。

舉例:實現經典的斐波那契數列

1, 1, 2, 3, 5, 8, 13, ...

def fab(n: Int): Int = {
    if(n <= 1) 1
    else fab(n - 1) + fab(n - 2)
}

Scala之默認參數:在Scala中,有時咱們調用某些函數時,不但願給出參數的具體值,而但願使用參數自身默認的值,此時就能夠在定義函數時使用默認參數。

def sayHello(firstName: String, middleName: String = "Jackson", lastName: String = "Jhon"): String = firstName + " " + middleName + " " + lastName

Scala之變長參數:在Scala中,有時咱們須要將函數定義爲參數個數可變的形式,則此時可使用變長參數定義函數。

舉例:

def sum(nums: Int*): Int = {
    var res = 0
    for (num <- nums) {
        res += num
    }
    res
}

使用序列調用變長參數:在若是想要將一個已有的序列直接調用變長參數函數,是不對的。好比val res = sum(1 until 10)。此時須要使用Scala的特殊語法將參數定義爲序列讓Scala解釋器可以識別。

舉例:使用遞歸函數實現累加

object Demo {
    def main(args: Array[String]): Unit = {
        println(sum(1 to 10: _*))
    }

    def  sum(nums: Int*): Int = {
        if (nums.length == 0) {
            0
        } else {
            nums.head + sum(nums.tail: _*)
        }
    }
}

 Scala中的lazy值:在Scala中,提供了lazy值的特性,也就是說,若是將一個變量聲明爲lazy,則只有在第一次使用該變量時,變量對應的表達式纔會發生計算。這種特性對於特別耗時的計算操做特別有用,好比打開文件進行IO,進行網絡IO等。

import scala.io.Source._
lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
即便文件不存在,也不會報錯,只有第一個使用變量時會報錯,證實了表達式計算的lazy特性。

val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
lazy val lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString
def lines = fromFile("C://Users//Administrator//Desktop//test.txt").mkString

Scala中的異常處理:在Scala中,異常處理和捕獲機制與Java是很是類似的。

import java.io.IOException

object Demo {
    def main(args: Array[String]): Unit = {
        try {
            throw new IllegalArgumentException("x should not be negative")
        } catch {
            case _: IllegalArgumentException => println("Illegal Argument!")
        } finally {
            println("release resources!")
        }

        try {
            throw new IOException("user defined exception")
        } catch {
            case e1: IllegalArgumentException => println("illegal argument")
            case e2: IOException => println("io exception")
        }

    }
}
相關文章
相關標籤/搜索