Sgg:Scala的基础语法(中)


控制结构

1 if else

Scala的控制结构基本思想与Java相似,但是语法不同。

  • if else的语句输出结果还可以单独赋值给一个变量。
	val i = 10;
    val result =  if(i > 10){
      println("大于10")
    }else{
      println("小于等于10")
    }

    println(result)

这个if else语句的输出结果赋给了result,那result是什么呢?result是空,因为prinln函数的返回值是空(unit)。

小于等于10
()

如果我们在 i > 10的情况下输出一个数字10,那result就会被赋值10,演示如下:

val i = 15;
    val result =  if(i > 10){
      println("大于10")
      10
    }else{
      println("小于等于10")
    }

    println(result)
  }
大于10
10

Process finished with exit code 0
  • Scala的if else返回值依然是代码中的最后一行,和当时学方法返回值时准则相同。
  • 定义result的时候,没有指定类型,又因为if else返回值有可能是if的返回结果(int)也有可能else后面的返回值(unit)。Scala的类型推断无法确定,因此自动给result推断一个他们的父类AnyVal。
    在这里插入图片描述
    如下示例道理相同(字符串是引用类型,Any是最顶级的父类):
    在这里插入图片描述
    下面是Scala各种数据类型关系图

    scala的if else语句和Java一样,严格来说也只是一个语句,因此也可以简写为:
val result2 = if (i > 10) println("大于10") else println("小于等于10")

条件表达式

	//根据Scala if else语句 有返回值的思想
    // 得到Scala的条件表达式改造写法
    val result4 = if(i > 10) 1 else 0

2 while

2.1 while循环

  • 没有返回值
  • 和 Java一样有do while 和 while
	var i = 0;
    val result = while (i < 10){
      println(i)
      i += 2
    }

    println(result)

编写了一个while,可以看到最后result打印出的是空()(Unit)。

2
4
6
8
()

Process finished with exit code 0

注: 因为 while 和 do…while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量 , 而变量需要声明在 while 循环的外部,那么就等同于循环的内部对外部的变量造成了影响, 也就违背了函数式编程的重要思想,所以不推荐使用。

2.2 while循环中断

  • 循环时候break continue 都不符合面向对象编程思想,因此Scala中不支持使用。
  • Scala 内置控制结构特地去掉了 break 和 continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决 break 和 contine 的功能,而不是一个关键字。
    首先导入一个包:
import scala.util.control.Breaks._

我们应用这个包下的breakable函数 :

    var i = 0;

    breakable(
      //被当作匿名函数
      () =>
      while (i < 10){
        println(i)
        i += 2
      }

    )

也可以把代码封装成一个方法,将这个方法作为参数传入breakable函数。

    breakable(testWhile _ )

    def testWhile():Unit = {
      while (i < 10){
        println(i)
        i += 2
      }
    }
  • 函数作为一个参数传入另一个函数,这种函数是高阶函数

  • 如何中断?(使用break())

    breakable {
      while (i < 10) {
        println(i)
        i += 2
        if(i == 6){
          break()
        }
      }
    }

在这里插入图片描述

  • 操作的所有都是函数来解决问题
  • breakable()是函数
  • 传入的while代码是匿名函数
  • 终止条件是break()也是函数

3 for循环

分为推导式和表达式
推导符号 <-

3.1前闭后闭

//    for(int s : {1,2,3,4}){
//
//    }

    for(i <- 1 to 5){
      println(i)
    }
  }

运行结果:

1
2
3
4
5

Process finished with exit code 0

3.2 前开后闭

  • 刚刚实验的是[1,5]前闭后闭
  • 现在介绍一个关键字until可以前开后闭
    //[1,5)
    for(i <- 1 until 5){
      println(i)
    }
1
2
3
4

Process finished with exit code 0

3.3 循环守卫

引入循环保护式(也称条件判断式,守卫)。保护式为 true 则进入循环
体内部, 为 false 则跳过,类似于 continue

    //守卫条件类似于continue的用法(比continue更强大)
    //[1,5)
    for(i <- 1 until 5 if(i != 3) ){
      println(i)
    }
1
2
4

Process finished with exit code 0

3.4 引用变量(倒序输出)

    for(i <- 1 to 5; j = 6 - i){
      println(j)
    }
5
4
3
2
1

Process finished with exit code 0

3.5 嵌套循环

    for(i <- 1 to 5){
      for(j <- 4 to 6){
        println(i + "," + j)
      }
    }
1,4
1,5
1,6
2,4
2,5
2,6
3,4
3,5
3,6
4,4
4,5
4,6
5,4
5,5
5,6

Process finished with exit code 0

还可以写的更简单

    for(i <- 1 to 5; j <- 4 to 6){
      println(i + "," + j)
    }

3.6 循环返回值

将遍历过程中处理的结果返回到一个新集合中,使用 yield 关键字

    //利用for循环产生集合
    val nums = for(i <- 1 to 5) yield i*10
    println(nums)
Vector(10, 20, 30, 40, 50)

Process finished with exit code 0

3.7 使用花括号{}代替小括号()

for允许使用多个代码段。

    for{i <- 1 to 5 ;
        j <- 3 to 4;
        if(i != 2 && j != 4)}{
    }

4 小练习

用Scala打印九九乘法表

    for{i <- 1 to 9;
        j <- 1 to i}{
      print(j + "×" + i + "=" + i * j + "\t");
      if( j == i) println()
    }
1×1=1	
1×2=2	2×2=4	
1×3=3	2×3=6	3×3=9	
1×4=4	2×4=8	3×4=12	4×4=16	
1×5=5	2×5=10	3×5=15	4×5=20	5×5=25	
1×6=6	2×6=12	3×6=18	4×6=24	5×6=30	6×6=36	
1×7=7	2×7=14	3×7=21	4×7=28	5×7=35	6×7=42	7×7=49	
1×8=8	2×8=16	3×8=24	4×8=32	5×8=40	6×8=48	7×8=56	8×8=64	
1×9=9	2×9=18	3×9=27	4×9=36	5×9=45	6×9=54	7×9=63	8×9=72	9×9=81	

Process finished with exit code 0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值