2023_Spark_实验四:SCALA基础

news2024/11/20 20:28:07

一、在IDEA中执行以下语句

或者用windows徽标+R  输入cmd 进入命令提示符

输入scala直接进入编写界面

1、Scala的常用数据类型

注意:在Scala中,任何数据都是对象。例如:

scala> 1
res0: Int = 1

scala> 1.toString
res1: String = 1

scala> "1".toInt
res2: Int = 1

scala> "abc".toInt
java.lang.NumberFormatException: For input string: "abc"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:580)
  at java.lang.Integer.parseInt(Integer.java:615)
  at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)
  at scala.collection.immutable.StringOps.toInt(StringOps.scala:29)
  ... 32 elided

1. 数值类型:Byte,Short,Int,Long,Float,Double

Byte: 8位有符号数字,从-128 到 127

Short: 16位有符号数据,从-32768 到 32767

Int: 32位有符号数据

Long: 64位有符号数据

例如:

val a:Byte = 10

a+10

得到:res9: Int = 

这里的res9是新生成变量的名字

val b:Short = 20

a+b

注意:在Scala中,定义变量可以不指定类型,因为Scala会进行类型的自动推导。

2. 字符类型和字符串类型:Char和String

    对于字符串,在Scala中可以进行插值操作。


scala> val s1="Hello World"

s1: String = Hello World



scala> "My Name is ${s1}"

res4: String = My Name is ${s1}



scala> s"My Name is ${s1}"

res5: String = My Name is Hello World

3. Unit类型:相当于Java中的void类型


scala> val f=()

f: Unit = ()



scala> val f={}

f: Unit = ()

4. Nothing类型:一般表示在执行过程中,产生了Exception

例如,我们定义一个函数如下:


scala> def myfunction=throw new Exception("Some Error")

myfunction: Nothing

2、Scala变量的申明和使用

使用val和var申明变量

例如:scala> val answer = 8 * 3 + 2 可以在后续表达式中使用这些名称

val:定义的值实际是一个常量

要申明其值可变的变量:var

注意:可以不用显式指定变量的类型,Scala会进行自动的类型推到

3、Scala的函数和方法的使用

可以使用Scala的预定义函数

例如:求两个值的最大值


scala> max(1,2)

<console>:12: error: not found: value max

       max(1,2)

       ^



scala> import scala.math._

import scala.math._



scala> max(1,2)

res7: Int = 2



scala> var result:Int=max(1,2)

result: Int = 2

也可以使用def关键字自定义函数

语法:


//求两个参数的和

def sum(x:Int,y:Int):Int=x+y

sum(1,2)

var d=sum(1,2)



//求每个数学的阶乘

def myFactor(x:Int):Int={

//采用递归算法得到阶乘

//注意:在SCALA 中,if..else 是一个表达式,所有有返回值,相当于省略的return



if (x<=1)

1

else

x*myFactor(x-1)

}

myFactor(5)

4、Scala的条件表达式

Scala的if/else语法结构和Java或C++一样。

不过,在Scala中,if/else是表达式,有值,这个值就是跟在if或else之后的表达式的值。

5、Scala的循环

Scala拥有与Java和C++相同的while和do循环

Scala中,可以使用for和foreach进行迭代

使用for循环案例:


//定义一个集合

var list=List("Mary","Tom","Mike")

println("************for 第一种写法************")

for (s<-list) println(s)



println("************for 第二种写法************")



for {

s<-list

if(s.length>3)

} println(s)

println("************for 第三种写法************")



for (s<-list if s.length<=3) println(s)

注意:

(*) <- 表示Scala中的generator,即:提取符

(*)第三种写法是第二种写法的简写

在for循环中,还可以使用yield关键字来产生一个新的集合

//定义一个集合



var list=List("Mary","Tom","Mike")



println("************for 第四种写法************")

var newList= for {

s<-list

s1=s.toUpperCase

} yield (s1)

使用while循环:注意使用小括号,不是中括号


println("************while 循环************")

var i=0

while(i<list.length){

println(list(i))

i+=1

}

使用do ... while循环


println("************do while 循环************")

var i=0

do {

println(list(i))

i+=1

}while (i<list.length)

使用foreach进行迭代


scala> val list=List("Mary","Tom","Mike")

list: List[String] = List(Mary, Tom, Mike)



scala> list.foreach(println)

Mary

Tom

Mike

注意:在上面的例子中,foreach接收了另一个函数(println)作为值

6、Scala函数的参数

Scala中,有两种函数参数的求值策略

Call By Value:对函数实参求值,且仅求一次

Call By Name:函数实参每次在函数体内被用到时都会求值

//Scala中函数参数的求值策略

// 1.call by value
def test1(x:Int,y:Int):Int=x+x

test1(3+4,8)



//2. call by name
def test2(x: => Int,y: =>Int):Int=x+x

test2(3+4,8)

稍微复杂一点的例子:

x是call by value,y是call by name

def bar(x:Int,y: => Int):Int = 1

定义一个死循环

def loop():Int = loop

调用:

bar(1,loop) //输出1

bar(loop,1) //死循环

我们来分析一下,上面两个调用执行的过程:

Scala中的函数参数

默认参数

代名参数

可变参数


//默认参数



def func1(name:String="Tom"):String ="Hello "+name

func1()

func1("marry")



//带名参数

def func2(str:String="Good Morning",name:String="Tom",age:Int=20)=str+name+" and the age of "+name + " is "+age

func2()

func2(age=25)



//变长参数:求多个数字的和

def sum(args:Int*)={

var result=0

for(arg<-args) result+=arg

result

}

7、Scala的Lazy值(懒值)

当val被申明为lazy时,它的初始化将被推迟,直到我们首次对它取值。


val x:Int =10



//定义y的时候才有lazy来休息,在定义它时候不会对其运算

lazy val y:Int=x+1

//第一次使用的时候,才会对其求值

y

一个更为复杂一点的例子:读取文件:


//第一次读取一个存在的文件

val words=scala.io.Source.fromFile("d:\\temp\\a.txt").mkString

lazy val words1=scala.io.Source.fromFile("d:\\temp\\a.txt").mkString

words1

//第二次读取一个不存在的文件,这时不会报错

lazy val words2=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString



//第一次调用的时候,才会对其运算,才会出现Exception

words2

8、异常的处理

Scala异常的工作机制和Java或者C++一样。直接使用throw关键字抛出异常。

使用try...catch...finally来捕获和处理异常:


//1.采用 try catch finally 来捕获异常和处理异常



try{

val words=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString

} catch {

case ex:java.io.FileNotFoundException => {

println("File Not Found")

}

case ex:IllegalArgumentException => {

println("Illegal Argument Exception")

}

case _:Exception =>{

println("*****Other Exception ****")

}

}finally {

println("****** final block ******")

}



//2.如果一个函数的返回类型是Nothing, 表示:在函数执行的过程中产生异样



def func1()=throw new IllegalArgumentException("Some Error Happened")



//3.if else 语句:如果在一个分支中产生了异常,则另外一个分支的返回值,将作为 if else 返回值的类型

val x=10

if(x>10){

scala.math.sqrt(x)

}else{

throw new IllegalArgumentException("The value should be not")

}

9、Scala中的数组

Scala数组的类型:

定长数组:使用关键字Array


//定长数组

val a=new Array[Int](10)

val b=new Array[String](5)

val c=Array("Tom","Mary","Mike")

变长数组:使用关键字ArrayBuffer

//变长数组: ArrayBuffer

val d = scala.collection.mutable.ArrayBuffer[Int] ()

//往变长数组中加入元素

d+=1

d+=2

d+=3

//往变长数组中加入多个元素

d+=(10,12,13)

//去掉最后两个值

d.trimEnd(2)

d.trimStart(2)

//将ArrayBuffer 转换成Array

d.toArray

遍历数组


//遍历数组

var a=Array("Tom","Mary","Mike")



//使用for 循环进行遍历

for (s<-a) println(s)



//对数组进行转换,新生成一个数组 yield

val b = for {

s<-a

s1=s.toUpperCase

}yield (s1)



//可以使用foreach进行循环输出

a.foreach(println)

b.foreach(println)

Scala数组的常用操作


import scala.collection.mutable.ArrayBuffer



val myArray = Array(1,10,2,3,5,4)

//求最大值

myArray.max



//求最小值

myArray.min



//求和

myArray.sum



//定义一个变长数组



var myArray1=ArrayBuffer(1,10,2,3,5,4)

//排序

myArray1.sortWith(_ > _)



//升序



myArray1.sortWith(_ < _)

Scala的多维数组

和Java一样,多维数组是通过数组的数组来实现的。

也可以创建不规则的数组,每一行的长度各不相同。


//定义一个固定长度的二维数组

val matrix = Array.ofDim[Int](3,4)

matrix(1)(2)=10

matrix



//定义一个二维数组,其中每个元素是一个一维数组,其长度不固定



val triangle = new Array[Array[Int]](10)

//通过一个循环赋值

for(i<-0 until( triangle.length)) triangle(i)=new Array[Int](i+1)

//观察这个二维数组中的每一个元素的长度

triangle

10、映射

映射就是Map集合,由一个(key,value)组成。

-> 操作符用来创建

映射的类型分为:不可变Map和可变Map


//不可变得Map

val math = scala.collection.immutable.Map("Alice"->80,"Bob"->95,"Mary"->70)



//可变的Map

val english = scala.collection.mutable.Map("Alice"->80,"Bob"->95,"Mary"->70)

val chinese = scala.collection.mutable.Map(("Alice",80),("Bob",95),("Mary",70))

映射的操作

获取映射中的值

//1.获取Map中的值

chinese("Bob") //chinese.get("Bob")

//chinese("Tom") 如果不存在,会抛出 Exception

//Map.constains 判断可以时候存在

if(chinese.contains("Alice")){

chinese("Alice")

}else{

-1

}



//简写



chinese.getOrElse("Alice",-1)

迭代映射


//迭代映射

for (s<-chinese) println(s)

chinese.foreach(println)

11、元组(Tuple)

元组是不同类型的值的聚集。

例如:val t = (1, 3.14, "Fred") // 类型为Tuple3[Int, Double, java.lang.String]

这里:Tuple是类型,3是表示元组中有三个元素。

元组的访问和遍历:


//定义tuple,包含3个元素

val t1=(1,2,"Tom")

val t2= new Tuple4("Mary",3.14,100,"Hello")



//访问tuple中的组员 _1

t2._1

t2._2

t2._3

t2._4



//t2._5 ---->error



//遍历 Tuple: for foreach ???



t2.productIterator.foreach(println)

//注意:要遍历Tuple中的元素,需要首先生成对应的迭代器,不能直接使用for 或者 foreach

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11 模型选择 + 过拟合和欠拟合

训练集&#xff1a;用于训练权重参数 验证集&#xff1a;用来调参&#xff0c;评价模型的好坏&#xff0c;选择合适的超参数 测试集&#xff1a;只用一次&#xff0c;检验泛化性能&#xff0c;实际场景下的数据 非大数据集通常使用K-折交叉验证 K-折交叉验证 一个数据集分成…

云原生Kubernetes:二进制部署K8S多Master架构(三)

目录 一、理论 1.K8S多Master架构 2.配置master02 3.master02 节点部署 4.负载均衡部署 二、实验 1.环境 2.配置master02 3.master02 节点部署 4.负载均衡部署 三、总结 一、理论 1.K8S多Master架构 (1) 架构 2.配置master02 &#xff08;1&#xff09;环境 关闭防…

Docker:自定义镜像

&#xff08;总结自b站黑马程序员课程&#xff09; 环环相扣&#xff0c;跳过部分章节和知识点是不可取的。 一、镜像结构 镜像是分层结构&#xff0c;每一层称为一个Layer。 ①BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统。 ②Entrypoint&#xff1…

Vue在表格中拿到该行信息的方式(作用域插槽-#default-scope-解决按钮与行点击的顺序问题)

遇到的问题 在做表格的时候&#xff0c;表格是封装好了的&#xff0c;用于展示数据。如果想给单行增加按钮&#xff0c;可以单独写一列存放按钮&#xff0c;最基本的需求是&#xff0c;点击按钮后要拿到数据然后发起请求。 且Vue的element-plus&#xff0c;当我们点击按钮之后…

python二级例题

请编写程序&#xff0c;生成随机密码。具体要求如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬ &#xff08;1&#xff09;使用 rand…

XSS漏洞及分析

目录 1.什么是xss漏洞 1&#xff09;存储型XSS漏洞 2&#xff09;反射型XSS漏洞 3&#xff09;DOM型XSS漏洞 2.什么是domcobble破环 3.案例一 1&#xff09;例题链接 2&#xff09;代码展示 3&#xff09;例题分析 4.案例二 1&#xff09;例题链接 2&#xff09;代…

jvm-堆

1.堆的核心概念 一个jvm实例只存在一个堆内存&#xff0c;堆也是java内存管理核心区域 java堆区在jvm启动的时候即被创建&#xff0c;其空间大小就确定了&#xff0c;是jvm管理最大的一块内存空间&#xff1b; 堆可以处于物理上不连续的内存空间&#xff0c;但在逻辑上它应该被…

Linux gdb调式的原理

文章目录 一、原理分析二、dmoe测试2.1 hello.s2.2 demo演示 参考资料 一、原理分析 #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <…

使用VBA快速比对数据

实例需求&#xff1a;第一行是全系列数据集合&#xff0c;现在需要对比第一行数据&#xff0c;查找第2行数据中缺失的数字&#xff0c;保存在第3行中。 具备VBA初步使用经验的同学&#xff0c;都可以使用双重循环实现这个需求&#xff0c;这里给大家提供另一种实现思路&#x…

写的一款简易的热点词汇记录工具

项目需要对用户提交的附件、文章、搜索框内容等做热词分析。如下图&#xff1a; 公司有大数据团队。本着不麻烦别人就不麻烦别人的原则&#xff0c;写了一款简易的记录工具&#xff0c;原理也简单&#xff0c;手工在业务插入锚点&#xff0c;用分词器分好词&#xff0c;排掉字…

阿晨的运维笔记 | CentOS部署Docker

使用yum安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 …

使用VBA快速关闭应用程序进程

使用VBA进行开发时&#xff0c;如果需要关闭其他Office应用程序&#xff0c;那么通常可以使用GetObject的方式获取该应用程序的引用&#xff0c;然后再关闭&#xff0c;有时需要重复多次以关闭多进程。如果希望关闭的应用程序并非Office组件&#xff0c;那么GetObject方式有时就…

裸露土方智能识别算法 python

裸露土方智能识别算法通过opencvpython网络模型框架算法&#xff0c;裸露土方智能识别算法能够准确识别现场土堆的裸露情况&#xff0c;并对超过40%部分裸露的土堆进行抓拍预警。此次算法用到的Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流…

NOR型flash vs NAND型flash

FLASH是一种存储芯片&#xff0c;全名叫Flash EEPROM Memory&#xff0c;通过程序可以修改数据&#xff0c;即平时所说的“闪存”。 闪存可以在软件的控制下写入和擦写数据。其存储空间被分割成相对较大的可擦除单元&#xff0c;成为擦除块&#xff08;erase block&#xff09…

嵌入式岗位笔试面试专栏 - 岗位介绍

文章目录 一、嵌入式岗位的分类二、热门领域及公司三、发展前景四、技能要求沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解嵌入岗位的工作职责 。 一、嵌入式岗位的分类 嵌入式软件工程师大致可以分为两种类型: 应用开发工程师驱动开发工程师应用工程…

【炼气境】HashMap原理以及如何使用

系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么&#xff1f;4、你知道 hash 的实现吗&#xff1f;为什么要这样实现&#xff1f;5、为什么要用异或运算符&#xff1f;6、HashMap 的 table 的容量如何确定&#xff1f;l…

PHP8内置函数中的变量函数-PHP8知识详解

在php8中&#xff0c;与变量相关的内置函数比较多&#xff0c;本文说一些比较重要的、常见的内置函数。今日着重讲解了5个&#xff0c;分别是&#xff1a;检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数…

【力扣周赛】第 359 场周赛(选择区间型DP⭐⭐⭐⭐⭐新题型 双指针)

文章目录 竞赛链接Q1&#xff1a;7004. 判别首字母缩略词&#xff08;模拟&#xff09;Q2&#xff1a;6450. k-avoiding 数组的最小总和解法1——贪心哈希表解法2——数学公式 Q3&#xff1a;7006. 销售利润最大化⭐⭐⭐线性DP相似题目列表2008. 出租车的最大盈利&#xff08;和…

2023.9.1 简单认识 JVM

目录 JVM 内存划分 本地方法栈 虚拟机栈 程序计数器 堆区 元数据区 JVM 类加载机制 加载 验证 准备 解析 初始化 类被加载的几种情况&#xff08;懒汉模式 ---> 只要被用到才会被加载&#xff09; 双亲委派模型 JVM 内存划分 JVM 是一个应用程序&#xff0c;在…

SSM(Spring-Mybatis-SpringMVC)

文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…