大数据处理学习笔记1.5 掌握Scala内建控制结构

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据处理学习笔记1.5 掌握Scala内建控制结构相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 掌握条件表达式
  2. 掌握各种循环
  3. 理解流间变量绑定
  4. 掌握yield语句的使用
  5. 掌握异常处理语句
  6. 了解match语句的使用
  7. 理解变量作用域

Scala提供的控制结构并不算多,因为在函数式编程中,可以自己开发出各种功能的控制结构,所以Scala提供的原生控制结构仅仅够用为止。

一、条件表达式

(一)语法格式

if (条件)1 else2

(二)执行情况

  • 条件为真,结果是值1;条件为假,结果是值2。如果if和else的返回结果同为某种类型,那么条件表达式结果也是那种类型,否则就是Any类型
  • Scala的条件表达式有点类似于Java的条件运算符

(三)案例演示

任务1、根据输入值的不同进行判断

  • 当然也可以在一个表达式中进行多次判断

  • 可以将上述条件表达式改造成嵌套的选择结构,可读性倒是提高了,但是简洁性降低了

  • 课堂练习:利用选择表达式评定学生成绩等级

  • 函数式编程语言,只有一个入口和一个出口,中间没有任何与外界交流的输入或输出语句,所以安全性非常好。

  • Java不是函数式语言,选择结构没有返回值,就必须根据不同情况对评语变量赋值。

任务2、编写Scala程序,判断奇偶性

  • 打开Scala项目ScalaDemo,创建net.huawei.day02包,在包里创建Example01对象
package net.huawei.day02

import scala.io.StdIn

/**
 * 功能:判断奇偶性
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example01 
  def main(args: Array[String]): Unit = 
    print("n = ")
    val n = StdIn.readLine.toInt
    if (n % 2 == 0)
      println(n.toString + "是偶数~")
    else
      println(n.toString + "是奇数~")
  

  • 运行程序,查看结果

  • 利用if结构具有返回值的特性,改写程序成为函数式风格

package net.huawei.day02

import scala.io.StdIn

/**
 * 功能:判断奇偶性
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example01 
  def main(args: Array[String]): Unit = 
    print("n = ")
    val n = StdIn.readLine.toInt
    val result = if (n % 2 == 0) n.toString + "是偶数~" else n.toString + "是奇数~"
    println(result)
  

  • 运行程序,查看结果

二、块表达式

(一)语法格式

语句组
  • 块表达式为包含在符号“”中的语句块

(二)执行情况

  • 需要注意的是,Scala中的返回值是最后一条语句的执行结果,而不需要像Java一样单独写return关键字。如果表达式中没有执行结果,就返回一个Unit对象,类似Java中的void

(三)案例演示

  • 语句块最后一句的值就是整个块表达式的结果

  • 语句块最后一句没有执行结果,那么块表达式结果就是Unit

三、for循环

(一)单重for循环

1、语法格式

for (变量 <- 集合或数组 (条件)) 
     语句组

2、执行情况

  • 表示将集合或数组中的每一个值循环赋给一个变量

3、案例演示

任务1:输出1到10

  • 两种方式实现,一种使用Range类,一种使用to运算符

  • Range(a, b): 从a到b,不包含b,跟Python里的range函数一样,含头不含尾

  • 1 to 10表示将1到10的所有值组成一个集合,且包括10。若不想包括10,则可使用关键字until

  • 用Java语言完成任务

  • 用Python语言完成任务

  • 打印字符直角三角形

  • 利用map函数产生每行星号构成的向量,然后利用foreach函数循环输出

  • 利用双重循环与流间变量,这个是Scala语言特有的东西

任务2、遍历字符串,输出每个字符

  • 方法一、按索引取字符串的每个字符(传统for循环)

  • 方法二:将字符串看作一个由多个字符组成的集合(增强for循环)

任务3、计算 1 + 2 + 3 + … + 100

  • 注意sum必须定义为var型变量
  • 利用集合的归并方法来求和最简单
  • 大家有兴趣可以去了解scala集合的聚合函数

任务4、输出列表内的偶数(过滤)

  • 采用三种方法来实现

  • 采用Java语言实现

  • 采用Python语言实现

任务5、输出全部两位素数

for (n <- 10 to 100; if !(n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0))  print(n.toString + " ")

(10 to 100).filter(n => !(n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0))

(二)嵌套for循环

1、语法格式

  • 传统格式
for (变量1 <- 集合或数组(条件)for (变量2 <- 集合或数组(条件)) 
       语句组
    

  • 特有格式
for (变量1 <- 集合或数组; 变量2 <- 集合或数组 (条件)) 
   语句组

2、案例演示

任务1、打印九九表

方法一、采用双重循环来实现
  • net.huawei.day02包里创建Example02对象
package net.huawei.day02

/**
 * 功能:双重循环打印九九表
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example02 
  def main(args: Array[String]): Unit = 
    for (i <- 1 to 9) 
      for (j <- 1 to i) 
        print(i.toString + "×" + j + "=" + (i * j) + "\\t")
      
      println()
    
  

  • 运行程序,查看结果
方法二、采用单重循环来实现
  • net.huawei.day02包里创建Example03对象
package net.huawei.day02

/**
 * 功能:单重循环打印九九表
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example03 
  def main(args: Array[String]): Unit = 
    for (i <- 1 to 9; j <- 1 to i) 
      print(i.toString + "×" + j + "=" + (i * j) + "\\t")
      if (j == i) println()
    
  

  • 运行程序,查看结果
方法三、采用单重循环与流间变量绑定来实现
  • net.huawei.day02包里创建Example04对象
  • 在for循环头里sep = if (i == j) "\\n" else "\\t"就是流间变量绑定
package net.huawei.day02

/**
 * 功能:单重循环与流间变量绑定打印九九表
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example04 
  def main(args: Array[String]): Unit = 
    for (i <- 1 to 9; j <- 1 to i; sep = if (j == i) "\\n" else "\\t") 
      print(i.toString + "×" + j + "=" + (i * j) + sep)
    
  

  • 运行程序,查看结果
方法四、采用单重循环、流间变量与yield来实现
  • for循环语句本身的返回值是Unit类型,无论在循环体中返回什么都是无效的,最终得到的都是Unit的值,但是可以在循环中的循环条件和循环体之间加上yield关键字,那么就可以将循环体产生的返回值组成数组进行返回。
  • net.huawei.day02包里创建Example05对象
package net.huawei.day02

/**
 * 功能:采用单重循环、流间变量与yield打印九九表
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example05 
  def main(args: Array[String]): Unit = 
    val list = for (i <- 1 to 9; j <- 1 to i; sep = if (j == i) "\\n" else "\\t")
      yield i.toString + "×" + j + "=" + (i * j) + sep
    list.foreach(print)
  

  • 运行程序,查看结果

任务2、去掉对角线

  • 一个三阶方阵,单元格的值是行号与列号的乘积,去掉对角线,输出剩余元素
  • 方法一、传统双重循环
package net.huawei.day02

/**
 * 功能:去掉对角元素
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example06 
  def main(args: Array[String]): Unit = 
    for (i <-1 to 3) 
      for (j <- 1 to 3) 
        if (i != j)
          print((i * j).toString + "\\t")
        else
          print("\\t")
      
      println()
    
  

  • 运行程序,查看结果
  • 方法二、特有双重循环
package net.huawei.day02

/**
 * 功能:去掉对角线元素
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example07 
  def main(args: Array[String]): Unit = 
    for (i <- 1 to 3; j <- 1 to 3; sep = if (i == j) "\\t" else (i * j).toString + "\\t") 
      print(sep)
      if (j == 3) println()
    
  

  • 运行程序,查看结果
  • 方法三:采用两个流间变量和yield
package net.huawei.day02

/**
 * 功能:去掉对角线元素
 * 作者:华卫
 * 日期:2023年02月22日
 */
object Example08 
  def main(args: Array[String]): Unit = 
    val list = for (i <- 1 to 3; j <- 1 to 3; sep = if (j==3) "\\n" else "\\t";
                    str = if (i != j) (i * j).toString + sep else " " + sep) yield str
    list.foreach(print)
  

  • 运行程序,查看结果

课堂练习:编程求解百钱买百鸡问题

  • 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
  • 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
    c o c k + h e n + c h i c k = 100 ( 1 ) c o c k × 5 + h e n × 3 + c h i c k 3 = 100 ( 2 ) \\begincases cock + hen + chick = 100 &(1) \\\\ cock \\times 5 + hen \\times 3 + \\displaystyle \\fracchick3= 100 & (2)\\\\ \\endcases cock+hen+chick=100cock×5+hen×3+3chick=100(1)(2)

四、条件循环

(一)while循环

1、语法格式

  • Scala的while循环与Java类似
while(条件)    
   循环体

2、案例演示

任务1、计算1+ 2 + 3 + … + 100

  • net.huawei.day02包里创建Example10对象

  • 注意:isum必须是变量

package net.huawei.day02

/**
 * 功能:等差数列求和
 * 作者:华卫
 * 日期:2023年02月23日
 */
object Example10 
  def main(args: Array[String]): Unit = 
    var sum = 0
    var i = 1
    while (i <= 100) 
      sum = sum + i
      i = i + 1
    
    println("1 + 2 + 3 + ... + 100 = " + sum)
  

  • 运行程序,查看结果
  • 采用函数式风格来写代码,递归函数来实现求和,注意:此处sum是常量
  • net.huawei.day02包里创建Example10_对象
package net.huawei.day02

/**
 * 功能:等差数列求和
 * 作者:华卫
 * 日期:2023年02月23日
 */
object Example10_ 
  def mx(n: Int, sum: Int): Int = 
    if (n > 0) mx(n - 1, sum + n) else sum
  

  def main(args: Array[String]): Unit = 
    println("1 + 2 + 3 + ... + 100 = " + mx(100, 0))
  

  • 运行程序,查询结果

任务2、打印全部水仙花数

  • 所谓水仙花数,是指等于其各位数字立方和的三位数。

\\qquad 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33
\\qquad 370 = 3 3 + 7 3 + 0 3 370=3^3+7^3+0^3 370=33+73+0Spark基础学习笔记12:Scala内建控制结构

大数据处理学习笔记1.4 掌握Scala运算符

大数据周会-本周学习内容总结09

大数据Scala学习—列表 集与映射

大数据Scala学习—列表 集与映射

2021年大数据常用语言Scala(十三):基础语法学习 函数 重点掌握