scala基础

1.声明变量:val var 

object Test {
  def main(args: Array[String]): Unit = {
    var num1 = 10 //var 可变
    num1 = 20
    println(num1)
    val num = 12 // 不可变
    //num2 = 10    // 报错

    //多个变量声明
    val num3, num4 = 10
    println(num3)
    println(num4)
  }
}
object Test {
  def main(args: Array[String]): Unit = {

    val name: String = "zhangsan" // 声明变量及类型
    //scala中可以不用声明类型,scala会自动类型推断
    println(name)
  }
}

2.数据类型

object Test {
  def main(args: Array[String]): Unit = {

    // scala中的几种数据类型:byte char short int long float double boolean richint richdouble richchar bigint bigdecimal
    //scala中没有基本数据类型和包装类之分,所有的数据类型都是类

    val a  = 1.toString
    println(a)

    println(1.to(10))  //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  }
}

3.if条件表达式

object Test {
  def main(args: Array[String]): Unit = {
    //scala中的if条件语句 与 java中的不同  java中的条件语句没有返回值  scala中有返回值
    val num = 10
    val a = if (num > 10) {
      1
    } else {
      0
    }
    println(a)
  }
}
object Test {
  def main(args: Array[String]): Unit = {
    //scala的每个表达式都有一个类型  
    //Int类型
    val num = 10
    val a = if (num > 10) {
      1
    } else {
      0
    }
    println(a)
    
    //混合类型  Any类型
    val b = if (num > 10) {
      1
    } else {
      "b"
    }

    println(b)
  }
}
object Test {
  def main(args: Array[String]): Unit = {

    val num = 10
    if (num > 20) {
      println("num>20")
    } else if (num > 10) {
      println("num<=20 and num>10")
    } else {
      println("num<=10")
    }
  }
}

scala中没有switch语句,但是有强大的模式匹配

4.块表达式和赋值

object Test {
  def main(args: Array[String]): Unit = {
    //scala中 {  } 包围的就是一个语句块,里面可以有很多表达式,最后一个表达式就是块的值
    val num = 10
    val result = {
      num + 10
    }
    println(result)

  }
}

5.输入和输出

object Test {
  def main(args: Array[String]): Unit = {

    //输出 print println printf
    printf("name=%s,age=%d", "zhangsan", 10)

    //    name=zhangsan,age=10
  }
}
object Test {
  def main(args: Array[String]): Unit = {

    //输入
    val name = readLine("name:")
    val age = readInt()
    printf("name=%s,age=%d", name, age)

//    name:zhangsan
//    10
//    name=zhangsan,age=10
  }
}

6.while循环、for循环

import scala.util.control.Breaks._

object Test {
  def main(args: Array[String]): Unit = {

    //while 循环
    var num = 1
    while (num <= 5) {
      println(num)
      num += 1
      //      num--  scala中没有++ --
    }

    //for循环

    for (i <- 1 to 5) { //包含5
      println(i)
    }
    for (i <- 1 until 5) { //不包含5
      println(i)
    }


    //    退出循环

    breakable {
      for (i <- 1 to 5) {
        if (i == 3) {
          break
        }
        println(i)
      }
    }

    breakable {
      while (num <= 5) {
        println(num)
        num += 1
        if (num == 3) {
          break
        }
      }
    }

  }

}

7.高级for循环和for推导式

object Test {
  def main(args: Array[String]): Unit = {

    //变量 <- 表达式 多个生成器,分号分隔
    for (i <- 1 to 3; j <- 1 to 3) {
      print(i * j) //123246369
    }

    //if守卫
    for (i <- 1 to 3 if i % 2 == 0; j <- 1 to 3) {
      print(i * j) //246
    }
  }

}
object Test {
  def main(args: Array[String]): Unit = {
    //   for推导式
    //for循环体用yield开始,循环会构造出一个集合,每次迭代生成集合中的一个元素
    val a = for (i <- 1 to 3) yield i
    println(a) // Vector(1, 2, 3)
  }
}

8.函数

object Test {
  // 函数
  //方法对对象进行操作 而函数不是

  //函数定义
  /*
  def 函数名(参数1:参数1类型,参数2:参数2类型):返回值类型 = {
          函数体
      }
  非递归函数不需要指定函数返回值类型
   */


  def mySum(a: Int, b: Int): Int = {
    a + b
  }

  //递归函数:函数本身调用函数
  def fac(n: Int): Int = {
    if (n <= 0) {
      1 //递归函数出口
    } else {
      n * fac(n - 1)
    }
  }


  def main(args: Array[String]): Unit = {
    //函数调用
    val result = mySum(1, 2)
    println(result) // 3

    val a = fac(3)
    println(a) // 6
  }
}

9.默认参数与带名参数

object Test {
  //默认参数
  def myString(str: String, left: String = "{", right: String = "}"): String = {
    left + " " + str + " " + right
  }


  def main(args: Array[String]): Unit = {

    //使用默认参数
    println(myString("zhangsan"))
    //使用自定义参数
    println(myString("zhangsan", "<<<", ">>>"))
    //参数格式不够
    println(myString("zhangsan", "<<<"))
    //使用带名参数
    println(myString(right = ">>>", left = ">>>", str = "zhangsan"))
    //带名参数与非带名参数混用   非带名参数要在带名参数前面
    println(myString("zhangsan", right = ">>>"))
  }
}

10.变长参数

object Test {
  //变长参数
  def mySum(num: Int*) = { // 计算偶数之和
    var sum = 0
    for (i <- num if i % 2 == 0) {
      sum += i
    }
    sum
  }


  def main(args: Array[String]): Unit = {

    //传入单个值时,必须是Int类型
    val result: Int = mySum(1, 2, 3)
    println(result)
    //传入一个序列
    val a = mySum(1 to 5: _*)
    println(a)

  }
}

11.过程

object Test {
  //过程
  //函数中不使用 = ,那么函数返回值类型为Unit 该函数称之为过程
  def myString(str: String, left: String = "{", right: String = "}") {
    println(left + " " + str + " " + right)
  }


  def main(args: Array[String]): Unit = {
   myString("zhangsan")
  }
}

12.懒值

object Test {


  def main(args: Array[String]): Unit = {
    // val 被声明为lazy 时,该变量将会推迟初始化
    // 只有到该变量的时候才会初始化
    lazy val words = scala.io.Source.fromFile("/usr/local/test.txt")

  }
}

13.异常

import java.io.FileNotFoundException

import math._

object Test {


  def main(args: Array[String]): Unit = {
    val x = 4
    //if else表达式 Double类型
    if (x > 0) {
      sqrt(x) //Double类型
    } else {
      throw new IllegalArgumentException("x should not be negative") //Nothing类型
    }
    //scala异常捕获,常用方式是模式匹配


    try {
      val words = scala.io.Source.fromFile("/usr/local/test.txt")
    } catch {
      case e: FileNotFoundException => {
        println("文件未找到")
      }
      case _ => {
        println("其他异常捕获处理")
      }
    } finally {
      println("最终处理")
    }
  }
}
原文地址:https://www.cnblogs.com/yin-fei/p/10823873.html