scala基础之控制结构

本文深入探讨Scala中的控制结构,包括for循环的不同用法、switch结构的灵活应用、try-catch块的异常处理方式,以及自定义控制结构的实现。特别介绍了for循环中的to和until关键字的区别、增强for循环和foreach的使用场景,还有switch结构中的模式匹配和条件判断。

在scala中IF表达式和while & do while循环和c,java是一样的,并没有什么不同。主要不同在于for循环和try catch语句块等

一for循环

1.1 使用关键字to

/**
 * to
会遍历到该值,而不是该值-1,这样的话下标从0开始,就会下标越界
 *
@param seq
 */
def forTo(seq:List[String]): Unit ={
    if (seq == Nil) {
        return;
    }
    for (x <- 0 to (seq.size - 1) ){
        print(seq(x)+" ")
    }
}

 

1.2 使用关键字until

/**
 * until 会遍历到下标为给定值 -1 ,不会有下标越界的问题
 * @param seq
 */
def forUntil(seq:List[String]): Unit ={
    if (seq == Nil) {
        return;
    }
    for (x <- 0 until seq.size){
        print(seq(x)+" ")
    }
}

 

1.3 增强for循环

/**
 * 增强for循环
 * @param seq
 */
def forEnhance(seq:List[String]): Unit ={
    if (seq == Nil) {
        return;
    }
    println()
    for (element <- seq){
        print(element+" ")
    }
}

 

1.4 foreach

/**
 * 更加高级的for 循环,这样口可以节省代码行数,相当于是一个语法糖吧
 * @param seq
 */
def foreach(seq:List[String]) : Unit = {
    if (seq == Nil) {
        return;
    }
    println()
    seq.foreach(element => print(element+" "))
}

 

1.5 forall

/**
 * forall遍历每一个元素看是否满足指定的条件,
 * 如条件全部满足,返回TRUE否则返回FALSE
 *
 * @param seq
 */
def forAll(seq:List[String]) : Unit = {
    if (seq == Nil) {
        return;
    }
    println()
    val result = seq.forall(element => element.startsWith("h"))
    println(result)
}

 

二 for ……yield 操作

def forYield(): Unit ={
    val ids = scala.collection.mutable.Set(1,2,3,
       4,5)
    val newSet = for (e <- ids) yield  Math.pow(e,2)
    newSet.toList.sorted.foreach(e => print(e+" "))
}

 

三 switch 结构

Scala中switch结构和java 和 c不一样

3.1 基础的匹配

def switch(x:Int): Unit = {
    Math.abs(xmatch {
        case 0 => println("false")
        case 1 => println("true")
        //whoa表示默认情况下
        case whoa => println("true")
    }
}

3.2 多个条件的匹配

def switchMultiCondition(x:Int): Unit = {
    Math.abs(xmatch {
        case 3|4|5 => println("spring")
        case 6|7|8 => println("summer")
        case 9|10|11 => println("autumn")
        case 12|1|2 => println("winter")
    }
}

3.3 匹配结果赋给一个变量,前提是有返回值

def switchMultiCondition(x:Int): Unit = {
    val result = Math.abs(xmatch {
        case 3|4|5 => "spring"
        case 6|7|8 => "summer"
        case 9|10|11 => "autumn"
        case 12|1|2 => "winter"
    }
    print(result)
}

 

3.4 访问匹配表达式的缺省默认值

def switch(x:Int): Unit = {
    Math.abs(xmatch {
        case 0 => println("false")
        case 1 => println("true")
        //whoa表示默认情况下给的变量名,你可以在后面的语句块中直接使用它
        case whoa => println("you provided value is: " +whoa+", so show true" )
    }
}

3.5 模式匹配

在匹配表达式中可以使用一种或者多种匹配模式,可以是常量模式,可以是变量模式,构造函数函数模式,序列模式或者元组或者类型模式

def echoWhatYouGiveMe(x:Any):String = x match {
    /*常量模式*/
    case 0 => "zero"
    case true => "true"
    case Nil => "an empty list"
    /*序列模式*/
    case List(0,_,_) => "A three-elements list with 0 as the first element"
    case List(1,_*) => "A List begining with 1,having any number of elements"
    case Vector(1,_*) => "A vector starting with 1,having any number of elements"

    /*元组模式*/
    case (a,b) => s"got $a and $b "
    case (a,b,c) => s"got $a and $b and $c "

    /*类型模式*/
    case s:String => s"you gave me this string is: $s"
    case i:Int => s"you gave me this int is: $i"
    case f:Float => s"you gave me this float is: $f"
    case a:Array[Double] => s"An array of double:${a.mkString(":")}"
    case list:List[_] => s"thanks for the List: $list"
    case map:Map[_,_] => map.toString
    /*默认值,其余情况*/
    case _ => "unknown"
}

 

3.6 匹配表达式使用case类

trait Animals {
    case class Dog(name:String) extends  Animals
    case class Cat(name:String) extends  Animals
    case object Woodpecker extends Animals

    object ClassTest extends App{
        def determineType(x:Animals):String = x match {
            case Dog(moniker) => "Got a dog, name is "+moniker
            case _:Cat => "Got a cat(igonre the name)"
            case Woodpecker => "That was a Woodpecker"
            case _ => "That was something else"
        }
        println(determineType(new Dog("Rocky")))
        println(determineType(new Cat("Miao")))
        println(determineType(Woodpecker))
    }
}

 

3.7 给case语句添加if语句

/**
 * 通过if 提供一个区间,然后匹配传递的值是否属于某一个区间
 * @param x
 */
def caseIfGuard(x:Int): Unit = {
    x match {
        case a if 0 to 9 contains(a) => println("0-9 range: "+a)
        case b if 10 to 19 contains(b) => println("10-19 range: " + b)
        case c if 20 to 29 contains(c) => println("20-29 range: " + c)
        case _ => println("unknown range")
    }
}

 

3.8 使用匹配表达式替换isInstanceOf

def replaceIsInstanceOf(x:Any): Boolean ={
    /*传统的判断一个类型*/
    if (x.isInstanceOf[List]){
        true
    }
    /*使用match case 去判断*/
    x match {
        case x:Set => true
        case _ => false
    }
}

 

3.9 匹配表达式中使用List

def sum(list: List[Int]):Int = list match {
    case Nil => 1
    case x::rest => x+sum(rest)
}

 

四 try {} catch{}

在try catch块中可以捕获一个或者多个异常

def trycatch_1(): Unit ={
    val s = "foods"
    try {
        val i = s.toInt
    } catch {
        case e:Exception => e.printStackTrace()
    }
}

/**
 * 可以捕获具体的异常
 * 也可以同时捕获多个异常
 */
def trycatch_2(): Unit ={
    val s = "foods"
    try {
        openFile("D:/a.txt")
    } catch {
        case e:FileNotFoundException => e.printStackTrace()
        case e:IOException => e.printStackTrace()
    }
}

 

/**
 * 我们可以不用关心具体的异常
 */
def trycatch_3(): Unit ={
    val s = "foods"
    try {
        openFile("D:/a.txt")
    } catch {
        case t:Throwable => t.printStackTrace()
    }
}

 

五 自定义控制结构

我们可以自定义控制结构,需要先定义一个函数,函数需要传入一个判断条件表达式和代码块

object Whilst {
    def whilst(condition: => Boolean)(codeBlock: => Unit) {
        if (condition) {
            codeBlock
            whilst(condition)(codeBlock)
        }
    }

    def main(args: Array[String]) {
        var i = 0;
        whilst(i < 5) {
            i = i+1;
            println(i)
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值