Scala学习--day02---控制流、“九层妖塔—杨辉三角”

简介: Scala学习--day02---控制流、“九层妖塔—杨辉三角”

分支控制

让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支

if-else

if (condition) {

   xxx

} else if (condition) {

   xxx

} else {

   xxx

}

实现一个小功能:输入年龄,如果年龄小于18岁,则输出“童年”。如果年龄大于等于18且小于等于30,则输出“年”,如果年龄大于30小于等于50,则输出中年否则,输出“老年”。

object ScalaBranch {
    def main(args: Array[String]): Unit = {
        val age = 30
        if ( age < 18 ) {
            println("童年")
        } else if ( age <= 30 ) {
            println("青年")
        } else if ( age <= 50 ) {
            println("中年")
        } else {
            println("老年")
        }
    }
}
  • scala中特殊一点,if-else语句也有返回值,也就是说也可以作为表达式,定义为执行的最后一个语句的返回值。
  • 可以强制要求返回Unit类型,此时忽略最后一个表达式的值,得到()
  • 多种返回类型的话,赋值的目标变量类型需要指定为具体公共父类,也可以自动推断。
  • scala中没有三元条件运算符,可以用if (a) b else c 替代a ? b : c
  • 嵌套条件同理。

image.png

循环流程---for

for循环,也叫for推导式:

  • 范围遍历:for(i <- 1 to 10) {},其中1 to 10Int一个方法调用,返回一个Range
  • 范围1 to 10 1 until 10是包含右边界和不包含右边界的范围,也可以直接用Range类。
  • 范围步长1 to 10 by 2
  • 范围也是一个集合,也可以遍历普通集合:for(i <- collection) {}
  • 循环守卫:即循环保护式,或者叫条件判断式,循环守卫为true则进入循环体内部,为fasle则跳过,类似于continue

写法:

for(i <- collection if condition) {
}

等价于:

if (i <- collection) {
    if (condition) {
    }
}

嵌套循环同理。嵌套循环可以将条件合并到一个for中:

  • 标准写法:
for (i <- 1 to 4) {
        for (j <- 1 to 5) {
            println("i = " + i + ", j = " + j)
        }
    }
  • 等价写法:
for (i <- 1 to 4; j <- 1 to 5) {
        println("i = " + i + ", j = " + j)
    }
  • 典型例子,乘法表:
for (i <- 1 to 9; j <- 1 to i) {
    print(s"$j * $i = ${i * j} \t")
    if (j == i) println()
}

1) 基本语法

for ( 循环变量 <- 数据集 ) {

   循环体

}

这里的数据集可以是任意类型的数据集合,如字符串,集合,数组等,这里我们还没有讲到集合,数组语法,请大家不要着急,先能演示例子,后面咱们详细讲。

/*java增强for循环
* for(Object obj:Array){
*   sout(obj)
* }
* scala:
*   for(obj:Object<-Array){}
* */
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for ( i <- Range(1,5) ) { // 范围集合
            println("i = " + i )
        }
        for ( i <- 1 to 5 ) { // 包含5
            println("i = " + i )
        }
      
      
    }
}

循环守卫

循环时可以增加条件来决定是否继续循环体的执行,这里的判断条件我们称之为循环守卫

object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for ( i <- Range(1,5) if i != 3  ) {
            println("i = " + i ) //1 2 4
        }
    }
}

循环步长

scala的集合也可以设定循环的增长幅度,也就是所谓的步长step

object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for ( i <- Range(1,5,2) ) {
            println("i = " + i )  //1 3
        }
        for ( i <- 1 to 5 by 2 ) {
            println("i = " + i )
        }
    }

 循环嵌套

    for(i<-1 to 3 ){
      for(j<-1 to 3){
        println("i="+i+",j="+j)
      }
    }
i=1,j=1
i=1,j=2
i=1,j=3
i=2,j=1
i=2,j=2
i=2,j=3
i=3,j=1
i=3,j=2
i=3,j=3
等同于
    for(i<-Range(1,4);j<-Range(1,4)){
      println("i="+i+",j="+j)
    }

引入变量

object ScalaLoop {
    def main(args: Array[String]): Unit = {
        for ( i <- Range(1,5); j = i - 1 ) {
            println("j = " + j )
        }
    }
}    
//    引入变量
    for(i<-1 to 3){
      val j=i-1
      println(j)
    }
    //简化
    for(i<-1 to 3;j=i-1){
      println(j)
    }

思考一个问题: 你们学java的时候都学过杨辉三角,那如何只使用一次for循环实现九层妖塔呢?蒙了吧?什么是九层妖塔!

image.png


object scalaLoop1 {
  def main(args: Array[String]): Unit = {
    //1
    //3
    //5
    //7   a1+(n-1)d  1+(n-1)*2  1+2n-2=2n-1
    //空9-n个空格
   for(i<-1 to 9){
     val stars=2*i-1
     val space =9-i
     println(" "*space+"*"*stars)
   }
  }
      //写法二
    for(stars<-1 to 17 by 2;spaces=(17-stars)/2){
      println(" "*spaces+"*"*stars)
    }

}

循环返回值

scala所有的表达式都是有返回值的。但是这里的返回值并不一定都是有值的哟

如果希望for循环表达式的返回值有具体的值,需要使用关键字yield

object scalaLoop2 {
  def main(args: Array[String]): Unit = {
//    如果希望for循环表达式的返回值有具体的值,需要使用关键字yield
    val result=for(i<-1 to 3) yield {
      i*2
    }
    println(result)
  }

}

Vector(2, 4, 6)

思考两个问题:

Ø 怎么全是问题?

Ø Java中的线程有yield方法,Scala中该如何调用?

Thread.`yield`()

 while循环

基本语法

当循环条件表达式返回值为true时,执行循环体代码

while( 循环条件表达式 ) {
    循环体
}

一种特殊的while循环就是,先执行循环体,再判断循环条件是否成立

do {
    循环体
} while ( 循环条件表达式 )

2) while循环

import scala.io.{BufferedSource, Source}

object Scala05_while {
  def main(args: Array[String]): Unit = {
    val source: BufferedSource = Source.fromFile("F:\\scala代码\\data\\word.txt")
    val value: Iterator[String] = source.getLines()
    while (value.hasNext){
      println(value.next())
    }
    source.close()
  }

}
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        var i = 0
        while ( i < 5 ) {
            println(i)
            i += 1
        }
    }
}

3) do...while循环

object ScalaLoop {
    def main(args: Array[String]): Unit = {
        var i = 5
        do {
            println(i)
        } while ( i < 5 )
    }
}

循环中断

scala是完全面向对象的语言,所以无法使用break,continue关键字这样的方式来中断,或继续循环逻辑,而是采用了函数式编程的方式代替了循环语法中的break和continue

//break(中断,跳出循环)
//continue (继续下一次循环)
public class TestFor {
    public static void main(String[] args) {
        for(int i=0;i<5;i++){
            if(i==3){
                continue;
            }
            System.out.println(i); //0 1 2 4

        }
    }
}
package 分支控制
import scala.util.control.Breaks
//import scala.util.control.Breaks._
//scala是完全面向对象的语言,所以无法使用break,
// continue关键字这样的方式来中断,或继续循环逻辑,而是采用了函数式编程的方式代替了循环语法中的break和continue
//break采用面向对象的方式来代替,底层会抛出异常跳出for循环,外层应该捕获异常
object Scala06_while {
  
  def main(args: Array[String]): Unit = {
    Breaks.breakable{
      for (i <- 1 to 5) {
        if (i == 3) {
          //不正确
         // return
          //return
          Breaks.break()
        }
        println("i=" + i)
      }
    }

    println("main方法执行完毕")
  }

}
object ScalaLoop {
    def main(args: Array[String]): Unit = {
        scala.util.control.Breaks.breakable {
            for ( i <- 1 to 5 ) {
                if ( i == 3 ) {
                    scala.util.control.Breaks.break
                }
                println(i)
            }
        }
    }
}


相关文章
|
2月前
|
Scala 容器
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
70 2
|
2月前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
64 2
|
2月前
|
Java 编译器 API
Scala学习--day01变量与数据类型、运算符
Scala学习--day01变量与数据类型、运算符
41 1
|
存储 算法 Java
Scala学习三-面向对象
前面我们已经学习了特质类似接口,其可以被继承,同时如果需要继承多个特质的话,则需要使用extends…with…进行继承。其类似java中的接口和抽象方法的结合体,但又比java中的其要强大,因为其可以定义抽象字段和普通字段、抽象方法和普通方法。而在java中接口中可以定义常量,不能定义变量。同时特质还可以继承class类,而在java中接口通常是用来实现的。 Object继承trait
116 0
Scala学习三-面向对象
|
Java Scala
Scala学习一
Scala中的方法与函数: 方法是属于类或者对象的,在运行时,它是加载到JVM的方法区中,而函数则是加载到JVM的堆内存中,同时可以将函数对象赋值给一个变量。函数是一个对象,继承自FunctionN,函数对象有apply、curried、toSting、tupled这些方法,而方法则没有。这是scala与java不同的地方。
81 0
Scala学习一
|
分布式计算 资源调度 Hadoop
基于mac构建大数据伪分布式学习环境(七)-部署Scala及Spark学习环境
本文主要讲解如何部署Scala与单机伪分布式Spark计算引擎
92 0
|
SQL 分布式计算 Scala
Scala学习总结
Scala学习总结
108 0
|
XML 分布式计算 大数据
Scala 学习 进击大数据Spark生态圈
Scala 学习 进击大数据Spark生态圈
|
分布式计算 IDE Java
终于,为了大数据分析我还是开启了Scala学习之路
要问当下最热门的IT技术,大数据可占一席之地;要问当下最网红的IT岗位,数据分析师也必将榜上有名。二者结合,自然就是大数据分析师。所谓大数据分析,个人理解就是在传统数据分析思维和技能的基础上,加持大数据工具,而Spark作为一个优秀的分布式计算框架,自然可作为大数据分析的必备技能。进一步地,虽然Spark提供了4种主流语言,但Scala作为Spark的原生开发语言,仍不失为应用Spark开发的首选。 基于以上考虑,我终于还是入坑了Scala的学习之旅——尽管Scala实际上属于一门小众语言,小众到似乎除了Spark甚至没什么用武之地
162 0
终于,为了大数据分析我还是开启了Scala学习之路