Scala入门【运算符和流程控制】

简介: Scala入门【运算符和流程控制】

运算符

       在 Scala 中其实是没有运算符的,所有运算符都是方法。我们只是省去了.方法名()中的点 .  和括号 ()

  1. 调用对象的方法时,点 . 可以省略
  2. 如果函数参数只有一个,或者没有参数,括号()可以省略。
//num1 + num2
num1.+(num2)
    val n1 = 12
    val n2 = 12
    //正常写法
    println(n1 + n2)
    println(n1 * n2)
    //标准过程
    println(n1.+(n2))
    println(n1.*(n2))
    println(7.5toInt.toString)
    //如果函数参数只有一个或者没有,括号()可以省略
    println((7.5.toInt).toString)
    //调用对象的方法 . 可以省略
    println((7.5 toInt) toString)

流程控制

这里只说和Java中稍微不同的地方

1、if 语句

       Scala和Java的 if 语句的基本用法是一致的,包括如果一个分支的逻辑代码只有一行,可以省去大括号{} ,与Java不同之处在于,Scala的 if - else 语句是可以有返回值的,具体取决于哪个分支满足条件。

案例1

import scala.io.StdIn
object Test02 {
  def main(args: Array[String]): Unit = {
    //输入成绩
    val score: Int = StdIn.readInt()
    //定义结果
    val res:String = if (score < 0 || score > 100){
      "输入错误"
    }else if (score > 0 && score < 60){
      "挂科了,等着重修吧"
    }else{
      "及格了"
    }
    println(res)
  }
}

案例2

如果Scala的返回值类型不一致,我们可以取它们的公共祖先类型。

    //输入成绩
    val score: Int = StdIn.readInt()
    //定义结果
    val res: Any = if (score < 0 || score > 100){
     -1
    }else if (score > 0 && score < 60){
      "挂科了,等着重修吧"
    }else{
      true
    }
    println(res)

案例3-三元运算符

Java中的三元运算符可以用Scala中的 if else 实现

val result: Any = if (score>60) true else  "挂科重修"
println(result)

2、For 循环结构

案例1-包含边界的范围遍历

    //遍历10次  
    //1.范围遍历 to是一个方法的调用,是1这个整型对象调用to方法传入参数10
    for (i <- 1 to 10){
      println(i + "hello scala")
    }
    //完整代码: (我们用上面的写法就好)
    for (i <- 1.to(10)){
      println(i + "hello scala")
    }

案例2-不包含边界的范围遍历

    //遍历9次
    //2.遍历 [1,10) Range默认步长=1,也就是一个一个取
    for (i <- Range(1,10)){
      println(i + "hello scala")
    }
    //效果和上面一样,只不过new Range的话需要指定步长
    for (i <- new Range(1,10,1)){
      println(i + "hello scala")
    }
    //同样 [1,10)
    for (i <- 1 until 10){
      println(i + "hello scala")
    }

案例3-集合遍历

    for (i <- Array(1,5,8)){
      println(i)
    }
    for (i <- List(1,5,8)){
      println(i)
    }
    for (i <- Set(1,5,8)){
      println(i)
    }
    for (i <- Map(("a",1),("b",2),(5,3))){
      println(i)
    }

循环守卫

案例-输出1-10,不输出5

如果用 Java:

for (int i=1;i<=10;i++){
    if(i==5){
        continue;
    }else{
        System.out.println(i);
    } 
}

但是如果用Scala只需要2行:

    //循环守卫
    for (i <- 1 to 10 if i!=5){
      print(i+" ")
    }

循环步长

输出1、3、5 、7 、9
    //循环步长
    for (i <- 1 to 10 by 2){
      print(i + " ")
    }
    //效果一样 推荐上面的写法
    for (i <- new Range(1,10,2)){
      print(i + " ")
    }
逆序输出10-1
    //设置步长为 -1
    for (i <- 10 to 1 by -1){
      print(i + " ")
    }
    //直接翻转输出
    for (i <- 1 to 10 reverse){
      print(i + " ")
    }
步长为 0.5

前提:步长数据类型为浮点数,范围也必须是小数范围

for (i <- 1.0 to 10.0 by 0.5){
      print(i + " ")
    }

二维数组打印

1,2,3
1,2,3
1,2,3

通常写法

    for (i <- 1 to 3){
      for (j <- 1 to 3) {
        print(s"第${i}行的内容: " + j + " ")
      }
      println()
    }

精简写法

for (i <- 1 to 3; j <- 1 to 3){
      println(s"第${i}行的内容: " + j + " ")
    }

99乘法表

有手就行

for (i <- 1 to 9){
    for (j <- 1 to i) {
        print(s"${j} * ${i} = ${i * j}  ")
    }
    println()
}
精简写法
for (i <- 1 to 9;  j<- 1 to 9){
    print(s"${j} * ${i} = ${i * j}  ")
        if (j==i) println()
}

引入变量

引入一个变量,这个变量和 i 的值有关。

for (i <- 1 to 10;j = 10 - i){
    println(s"i=${i},j=${j} ")
}

通常的写法

for {
    i <- 1 to 10
    j = 10 - i
}
{
      println(s"i=${i},j=${j} ")
}

九层妖塔

需求:传入参数 n ,输出 n 层妖塔

def main(args: Array[String]): Unit = {
    print_town(10)
  }
  def print_town(floor: Int): Unit ={
    for {
      i <- 1 to floor
      j = 2 * i - 1   //当前行 * 的个数
      l = floor * 2 - 1 //最后一行的 * 的个数
      k = (l - j) / 2 //当前行空格的个数
    }{
      print(" "*k)
      println("*"*j)
    }
  }

输出结果:

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

循环返回值

循环的返回值是将每次循环的结果保存到一个集合当中的,最后一起返回

案例-返回1-10的平方
//返回一个集合
    val res: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i
    print(res)

运行结果:

Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

可以看到,代码十分简洁,这也说明了Scala对于处理大数据的方便性。

While 循环

       和 Java 的用法一模一样,但Scala并不推荐使用 While 循环。因为我们如果希望通过while循环得到某个结果,就需要在循环外部定义一个变量(类似于全局变量),在循环内部进行相关的处理,如果在大数据处理的场景下,我们往往是并行处理,这样如果我们每个机器执行的代码块操作的是同一个变量,显然结果是不正确的。所以一般更加推荐的是 for 循环这种可以有返回值的循环。

案例-输出1-10

var a = 1
    while (a <= 10){
      println(a)
      a += 1
    }

循环中断

       Scala并没有 continue 和 break,是为了更好地实现函数式编程推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala 中使用breakable 控制结构来实现 break 和 continue 功能。

案例-输出0-4 [在2处中]

Breaks.breakable(
      for (i <- 0 until 5) {
        if (i == 3)
          Breaks.break()
        println(i)
      }
    )

原理:Breaks.breakable()的原理其实是通过 try-catch 抛出异常来终止循环。

我们自己也可以实现:

try {
      for (i <- 0 until 5) {
        if (i == 3)
          Breaks.break()
        println(i)
      }
    }catch{
      case e: Exception => RuntimeException
    } 
}
最简写法

我们可以直接导入整个Breaks类的所有方法,直接通过方法名来实现,简化代码

//下划线 _ 相当于Java的 *
import scala.util.control.Breaks._
breakable(
      for (i <- 0 until 5) {
        if (i == 3)
          break()
        println(i)
      }
    )


相关文章
|
5月前
|
分布式计算 Java Hadoop
Scala入门必刷的100道练习题(附答案)
Scala入门必刷的100道练习题(附答案)
589 1
|
2月前
|
分布式计算 大数据 Java
Scala 入门指南:从零开始的大数据开发
Scala 入门指南:从零开始的大数据开发
|
3月前
|
分布式计算 大数据 Java
大数据开发语言Scala入门
大数据开发语言Scala入门
|
3月前
|
IDE 大数据 Java
「AIGC」大数据开发语言Scala入门
Scala,融合OOP和FP的多范式语言,在JVM上运行,常用于大数据处理,尤其与Apache Spark配合。要开始学习,安装Scala,选择IDE如IntelliJ。基础包括变量、数据类型、控制结构、函数。Scala支持类、对象、不可变数据结构、模式匹配和强大的并发工具。利用官方文档、教程、社区资源进行学习,并通过实践提升技能。
46 0
|
5月前
|
Java 编译器 API
Scala学习--day01变量与数据类型、运算符
Scala学习--day01变量与数据类型、运算符
|
5月前
|
Java Shell API
Scala入门【变量和数据类型】
Scala入门【变量和数据类型】
|
安全 Java 编译器
Scala语言入门:初学者的基础语法指南
作为一种在Java虚拟机(JVM)上运行的静态类型编程语言,Scala结合了面向对象和函数式编程的特性,使它既有强大的表达力又具备优秀的型态控制
75 0
|
JavaScript 前端开发 Java
Scala语言入门以及基本语法
Scala语言入门以及基本语法
|
分布式计算 Java 程序员
spark开发基础之从Scala符号入门Scala
spark开发基础之从Scala符号入门Scala
171 0
spark开发基础之从Scala符号入门Scala