目录
一、分支控制if-else
1.1 单分支
1.1.1 基本语法
当条件表达式为true时,执行{}中的代码块
if(条件表达式){
执行代码块
}
1.1.2 案例
import scala.io.StdIn
object TestIf {
def main(args: Array[String]): Unit = {
println("input age:")
val age = StdIn.readInt()
if(age<18){
println("童年")
}
}
}
1.2 双分支
1.2.1 基本语法
if(条件表达式){
执行代码块1
}else{
执行代码块2
}
1.2.2 案例
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age:")
val age = StdIn.readInt()
if(age<18){
println("童年")
}else{
println("成年")
}
}
}
1.3 多分支
1.3.1 基本语法
if(条件表达式1){
执行代码块1
}else if(条件表达式2){
执行代码块2
}
...
else{
执行代码块n
}
1.3.2 案例
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age:")
val age = StdIn.readInt()
if(age<18){
println("童年")
}else if(age>=18 && age<30){
println("中年")
}else{
println("老年")
}
}
}
注意:
1.Scala 中 if else 表达式其实是有返回值的,具体返回值取决于满足条件的代码体的最后一行内容。
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age")
var age = StdIn.readInt()
val res :String = if (age < 18){
"童年"
}else if(age>=18 && age<30){
"中年"
}else{
"老年"
}
println(res)
}
}
2.Scala 中返回值类型不一致,取它们共同的祖先类型。
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age")
var age = StdIn.readInt()
val res:Any = if (age < 18){
"童年"
}else if(age>=18 && age<30){
"中年"
}else{
100
}
println(res)
}
}
3.Java 中的三元运算符可以用 if else 实现
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
println("input age")
var age = StdIn.readInt()
//省略大括号只对最近的一句代码起作用
val res:Any = if (age < 18) "童年" else "成年" "不起作用"
println(res)
}
}
二、嵌套分支
if(条件表达式1){
if(条件表达式2){
代码块
}else{
代码块
}
}
2.2 案例
import scala.io.StdIn
object TestIfElse {
def main(args: Array[String]): Unit = {
print("input age:\t")
var age = StdIn.readInt()
val result = if(age<18){
"童年"
}else{
if(age<30){
"中年"
}else{
"老年"
}
}
println(result)
}
}
三、模式匹配
3.1 基本语法
import scala.io.StdIn
object TestMatchCase {
def main(args: Array[String]): Unit = {
print("请输入你需要的服务号:\t")
val dial = StdIn.readInt()
val result = dial match {
case 1=>"充值"
case 2=>"话费查询"
case 3=>"人工服务"
case _=>"无此服务"
}
println(result)
}
}
3.1.2 说明
(1)如果所有 case 都不匹配,那么会执行 case _ 分支,类似于 Java 中 default 语句,若此时没有 case _ 分支,那么会抛出 MatchError。
(2)每个 case 中,不需要使用 break 语句,自动中断 case。
(3)match case 语句可以匹配任何类型,而不只是字面量。
(4)=> 后面的代码块,直到下一个 case 语句之前的代码是作为一个整体执行,可以
使用{}括起来,也可以不括
3.2 if模式守卫
3.2.1 说明
如果想要表达匹配某个范围的数据,就需要在模式匹配中增加条件守卫。
3.2.2 案例
当成绩大于等于90时等级为A,成绩大等于于80时等级为B,成绩大于等于60时等级为C,成绩低于60时等级为D
import scala.io.StdIn
object TestMatchCase {
def main(args: Array[String]): Unit = {
print("请输入成绩:\t")
val score = StdIn.readInt()
val result = score match {
case _ if(score >= 90) => "A"
case _ if(score >= 80) => "B"
case _ if(score >= 60) => "C"
case _ => "D"
}
println(result)
}
}
3.3 正则模式守卫
3.3.1 说明
如果想要表达匹配某个正则表达式,就需要在模式匹配中增加正则守卫。
3.3.2 案例
判断输入的字符串是邮箱、手机号还是身份证号
import scala.io.StdIn
object TestMatchCase {
def main(args: Array[String]): Unit = {
print("请输入字符串:\t")
val value = StdIn.readLine()
val rMail = "\\w+@\\w{2,}\\.(com|cn|org|net)".r
val rPhone = "(1)[3-9]\\d{9}".r
val rPid = "\\d{17}(\\d|X)".r
val result = value match {
case rMail(value) => "MAIL"
case rPhone(value) => "PHONE"
case rPid(value) => "PID"
case _ => "unknown"
}
println(result)
}
}
3.4 类型模式守卫
3.4.1 说明
需要进行类型判断时,可以使用模式守卫
3.4.2 案例
object TestMatchClass {
def describe(x: Any) = x match {
case i: Int => "Int"
case s: String => "String hello"
case m: List[_] => "List"
case c: Array[Int] => "Array[Int]"
case someThing => "something else " + someThing
}
def main(args: Array[String]): Unit = {
//泛型擦除
println(describe(List(1, 2, 3, 4, 5)))
//数组例外,可保留泛型
println(describe(Array(1, 2, 3, 4, 5, 6)))
println(describe(Array("abc")))
}
}
3.5 匹配数组
3.5.1 说明
object TestMatchArray {
def main(args: Array[String]): Unit = {
for (arr <- Array(Array(0), Array(1, 0), Array(0, 1, 0),
Array(1, 1, 0), Array("hello", 90),Array(1, 1, 0, 1))) { //对一个数组集合进行遍历
val result = arr match {
case Array(0) => "0" //匹配 Array(0) 这个数组
case Array(x, y) => x + "," + y //匹配有两个元素的数组,然后将将元素值赋给对应的 x,y
case Array(0, _*) => "以 0 开头的数组" //匹配以 0 开头和数组
case _ => "something else"
}
println("result = " + result)
}
}
}
3.6 匹配列表
object TestMatchList {
def main(args: Array[String]): Unit = {
//list 是一个存放 List 集合的数组
for (list <- Array(List(0), List(1, 0), List(0, 0, 0), List(1,
0, 0), List(88))) {
val result = list match {
case List(0) => "0" //匹配 List(0)
case List(x, y) => x + "," + y //匹配有两个元素的 List
case List(0, _*) => "0 ..."
case List(x) => x
case _ => "something else"
}
println(result)
}
}
}
3.7 匹配元组
object TestMatchTuple {
def main(args: Array[String]): Unit = {
//对一个元组集合进行遍历
for (tuple <- Array((0, 1), (1, 0), (1, 1), (1, 0, 2))) {
val result = tuple match {
case (0, _) => "0 ..." //是第一个元素是 0 的元组
case (y, 0) => "" + y + "0" // 匹配后一个元素是 0 的对偶元组
case (a, b) => "" + a + " " + b
case _ => "something else" //默认
}
println(result)
}
}
}
3.8 匹配对象及样例类
3.8.1 基本语法
class User(val name: String, val age: Int)
object User {
def apply(name: String, age: Int): User = new User(name, age)
def unapply(user: User): Option[(String, Int)] = {
if (user == null)
None
else
Some(user.name, user.age)
} }
object TestMatchUnapply {
def main(args: Array[String]): Unit = {
val user: User = User("zhangsan", 11)
val result = user match {
case User("zhangsan", 11) => "yes"
case _ => "no"
}
println(result)
}
}
case class User(name: String, age: Int)
object TestMatchUnapply {
def main(args: Array[String]): Unit = {
val user: User = User("zhangsan", 11)
val result = user match {
case User("zhangsan", 11) => "yes"
case _ => "no"
}
println(result)
} }
3.9 变量声明中的模式匹配
case class Person(name: String, age: Int)
object TestMatchVariable {
def main(args: Array[String]): Unit = {
val (x, y) = (1, 2)
println(s"x=$x,y=$y")
val Array(first, second, _*) = Array(1, 7, 2, 9)
println(s"first=$first,second=$second")
val Person(name, age) = Person1("zhangsan", 16)
println(s"name=$name,age=$age")
} }
3.10 for表达式中的模式匹配
object TestMatchFor {
def main(args: Array[String]): Unit = {
val map = Map("A" -> 1, "B" -> 0, "C" -> 3)
for ((k, v) <- map) { //直接将 map 中的 k-v 遍历出来
println(k + " -> " + v) //3 个
}
println("----------------------")
//遍历 value=0 的 k-v ,如果 v 不是 0,过滤
for ((k, 0) <- map) {
println(k + " --> " + 0) // B->0
}
println("----------------------")
//if v == 0 是一个过滤的条件
for ((k, v) <- map if v >= 1) {
println(k + " ---> " + v) // A->1 和 c->33
}
}
}