Spark大数据分析与实战笔记(第一章 Scala语言基础-2)

文章目录

  • 章节概要
  • [1.2 Scala的基础语法](#1.2 Scala的基础语法)
    • [1.2.1 声明值和变量](#1.2.1 声明值和变量)
    • [1.2.2 数据类型](#1.2.2 数据类型)
    • [1.2.3 算术和操作符重载](#1.2.3 算术和操作符重载)
    • [1.2.4 控制结构语句](#1.2.4 控制结构语句)
    • [1.2.5 方法和函数](#1.2.5 方法和函数)

章节概要

Spark是专为大规模数据处理而设计的快速通用的计算引擎,它是由Scala语言开发实现的,关于大数据技术,本身就是计算数据,而Scala既有面向对象组织项目工程的能力,又具备计算数据的功能,同时Spark和Scala的紧密集成,本书将采用Scala语言开发Spark程序,所以学好Scala将有助于我们更好的掌握Spark框架。

1.2 Scala的基础语法

1.2.1 声明值和变量

Scala有两种类型的变量,一种是使用关键字var声明的变量,值是可变的;另一种是使用关键字val声明的变量,也叫常量,值是不可变的。

  • 使用关键字var声明的变量
    var myVar:String="Hello"
  • 使用关键字val声明的变量
    val age:Int=10

有以下几个事项需要注意:

  1. Scala中的变量在声明时必须进行初始化。
  2. 使用var声明的变量可以在初始化后再次对变量进行赋值;
  3. 使用val声明的常量的值不可被再次赋值。

声明变量时,我们可以不给出变量的类型,因为在初始化的时候,Scala的类型推断机制能够根据变量的初始化的值自动推算出来。

上述声明变量myVar和age的代码,等同于下列代码:

复制代码
var myVar = "Hello"   //使用关键字var声明的变量

val age = 10           //使用关键字val声明的变量

注:使用关键字var或val声明变量时,后面紧跟的变量名称不能和Scala中的保留字重名,而且变量名可以以字母或下划线开头,且变量名是严格区分大小写的。

1.2.2 数据类型

  • 任何一种编程语言都有特定的数据类型,Scala也不例外。
  • 与其他语言相比,Scala中的所有值都有一个类型,包括数值和函数。

Scala中数据类型的层次结构

从上图中可以看出,Any是所有类型的超类型,也称为顶级类型,它包含两个直接子类,具体如下:

  • AnyVal:表示值类型,值类型描述的数据是一个不为空的值,而不是一个对象。它预定义了9种类型,分别是Double、Float、Long、Int、Short、Byte、Unit、Char和Boolean。其中,Unit是一种不代表任何意义的值类型,它的作用类似Java中void。

  • AnyRef:表示引用类型。可以认为,除值以外,所有类型都继承自AnyRef。

在Scala数据类型层级结构底部,还有两个数据类型,分别是Nothing和Null,具体介绍如下:

  • Nothing:所有类型的的子类型,也称为底部类型。它觉的用途是发出终止信号,例如抛出异常、程序退出或无限循环。
  • Null:所有引用类型的子类型,它主要用途是与其他JVM语言互操作,几乎不在Scala代码中使用。

1.2.3 算术和操作符重载

Scala中算术操作符(+、-、*、/、%)的作用和Java是一样的,位操作符(&、|、>>、<<)也是一样的。特别强调的是,Scala的这些操作符其实是方法。例如,a+b其实是a.+(b)的简写。

注:Scala没有提供操作符++和--。如果我们想实现递增或者递减的效果,可以使用"+=1"或者"-=1"这种方式来实现。

1.2.4 控制结构语句

在Scala中,控制结构语句包括条件分支语句和循环语句。其中,条件分支语句有if语句、if...else语句、if...else if...else语句以及if...else嵌套语句;循环语句有for循环,while循环和do...while循环。

  1. 条件分支语句
  • if条件语句

    if (布尔表达式){
    语句块
    }

  • if-else条件语句

    if (布尔表达式){
    语句块
    } else{
    语句块
    }

  • if-else-if-else语句

    if (布尔表达式1){
    语句块
    } else if(布尔表达式2){
    语句块
    } else if(布尔表达式3){
    语句块
    } else {
    语句块
    }

  • if-else嵌套语句

    if (布尔表达式1){
    语句块
    if(布尔表达式2){
    语句块
    }
    }else if (布尔表达式3){
    语句块
    else if (布尔表达式4){
    语句块
    }
    }else{
    语句块
    }

示例代码如下:

  1. 循环语句

Scala中的for语句和Java中的循环语句在语法上有较大的区别,下面我们来介绍一下Scala中的for循环语句。

  • for循环语句

    for(变量<-表达式/数组/集合){
    循环语句;
    }

下面,我们通过从0循环到9,每循环一次则就将该值打印输出进行操作演示。在Scala语法中,可以使用"0 to 9"表示从0到9的范围,范围包含9,示例代码如下:

  • Dos 命令行下

  • IDEA下

    结果如下:
    0 1 2 3 4 5 6 7 8 9

Scala在for循环语句中可以通过使用if判断语句过滤一些元素,多个过滤条件用分号分隔开。例如,输出0-9范围中大于5的偶数,示例代码如下:

  • while循环语句

    Scala中的while循环语句和Java中的完全一样,语法格式如下:

  • while语句

    while(布尔表达式){
    循环语句;
    }

下面,我们通过打印输出奇数的案例来演示while的使用。

假设有一个变量x=1,判断是否小于10,如果是则打印输出,然后再进行+2运算。

示例代码如下:

  • do-while语句

    do{
    循环语句;
    }while(布尔表达式)

do...while循环语句与while语句的主要区别是,do...while语句的循环语句至少执行一次,示例代码如下:

1.2.5 方法和函数

在Scala中,它和Java一样也是拥有方法和函数。Scala的方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说,在类中定义的函数即是方法。

Scala中可以使用def语句和val语句定义函数,而定义方法只能使用def语句。下面分别对Scala的方法和函数进行讲解。

  1. 方法
    Scala方法的定义格式如下:

    def functionName ([参数列表]):[return type]={
    function body
    return [expr]
    }

下面定义一个方法add,实现两个数相加求和,示例代码下:

复制代码
def add(a:Int,b:Int):Int={
  var sum:Int = 0
  sum = a + b
  return sum
}

Scala的方法调用的格式如下:

复制代码
//没有使用实例的对象调用格式
functionName(参数列表)

//方法使用实例的对象来调用,我们可以使用类似Java的格式("."号)
[instance.]functionName(参数列表)

下面,在类Test中,定义一个方法addInt,实现两个整数相加求和。在这里, 我们通过"类名.方法名(参数列表)"来进行调用,示例代码如下:

复制代码
scala> :paste                         # 多行输入模式的命令
// Entering paste mode (ctrl-D to finish)
object Test{
def addInt(a:Int,b:Int):Int={
  var sum:Int =0
  sum = a + b
  return sum
 }
}
// Exiting paste mode, now interpreting. # Ctrl+d结束多行输入模式
defined object Test
scala> Test.addInt(4,5)      # 方法调用
res0: Int = 9
  1. 函数
    Scala中的函数是一个对象,可以赋值给一个变量。
    Scala函数的定义语法格式如下:

    val functionName ([参数列表]):[return type]={
    function body
    return [expr]
    }

下面,定义一个函数addInt,实现实现两个整数相加求和,示例代码如下:

复制代码
scala> val addInt =(a:Int,b:Int) => a+b
addInt: (Int, Int) => Int = <function2>
scala> addInt(6,7)
res1: Int = 13
  • 方法转换成函数
    方法转换成函数的格式如下:

    val f1 = m _

在上述的格式中,方法名m后面紧跟一个空格和下划线,是为告知编译器将方法转换成函数,而不是要调用这个方法。下面,定义一个方法m,实现将方法m转成函数,示例代码如下:

复制代码
scala> def m(x:Int,y:Int):Int=x*y          # 方法
m: (x: Int, y: Int)Int
scala> val f = m _
f: (Int, Int) => Int = <function2>          # 函数
scala> f(2,3)
res2: Int = 6

注:Scala方法的返回值类型可以不写,编译器可以自动推断出来,但是对于递归方法来说,必须要指定返回类型。

转载自:https://blog.csdn.net/u014727709/article/details/132031799

欢迎start,欢迎评论,欢迎指正

相关推荐
今儿敲了吗13 分钟前
46| FBI树
数据结构·c++·笔记·学习·算法
苦瓜小生39 分钟前
【黑马点评学习笔记 | 实战篇 】| 6-Redis消息队列
redis·笔记·后端
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2025.03.19 题目:3212.统计X和Y频数相等的子矩阵数量
笔记·leetcode·矩阵
巧克力味的桃子3 小时前
国名排序题笔记(字符串函数 + fgets 详解)
笔记
四谎真好看3 小时前
Redis学习笔记(实战篇3)
redis·笔记·学习·学习笔记
bennybi3 小时前
Openclaw 实践笔记
笔记·ai·openclaw
AI视觉网奇3 小时前
aigc 生成几何图 整理笔记
笔记·aigc
今儿敲了吗3 小时前
python基础学习笔记第五章——容器
笔记·python·学习
V1ncent Chen4 小时前
SQL大师之路 14 子查询
数据库·sql·mysql·数据分析
三水不滴4 小时前
Elasticsearch 实战系列(二):SpringBoot 集成 Elasticsearch,从 0 到 1 实现商品搜索系统
经验分享·spring boot·笔记·后端·elasticsearch·搜索引擎