Scala基础学习

主要用来处理数据,不处理web,没有类似spring的框架

1. Scala简介

我们基于的scala版本 2.12.10

scala是运行在 JVM 上的多范式(规范)编程语言,同时支持面向对象和面向函数编程。(真实数据与操作过程解耦)

早期scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。scala的主要优势是它的表达性。

官网地址 http://www.scala-lang.org

2. 为什么要使用scala

  • 表达能力强
  • 开发大数据应用程序(Spark程序、Flink程序)
  • 兼容Java,可以访问的Java类库
  • 支持「并发」

3. 安装IDEA的Scala插件

pom文件添加依赖:

<dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>2.12.8</version>
</dependency>
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>2.4.7</version>
</dependency>
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>2.4.7</version>
</dependency>

IDEA默认是不支持scala程序开发,所以需要来安装Scala插件来支持Scala语言。

1. 添加Scala插件后,重启IDEA

2. 需要在project structure --> global libiray 添加scala 2.11.10 依赖(IDE2024没有添加,也可以正常使用)

3. 创建.scala文件

入门案例:

//object: 静态类,这个类里面的所有方法都是静态的,
object demo1 {def main(args: Array[String]): Unit = {print("scala测试")}
}// 实例的概念
class demo1{def met1(): Unit = {  // Unit代表没有返回的值}
}

 运行结果:

4. Scala中声明变量

语法格式:

val/var 变量名称:变量类型 = 初始值

其中

`val`定义的是**不可重新赋值**的变量(值不可修改) :常量
`var`定义的是**可重新赋值**的变量(值可以修改):变量

val param1:String = "测试scala"
var param2:Int = 100
println(param1)
println(param2)

5. 方法和函数

5.1 方法

语法

def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {// 方法体
}

说明

- 参数列表的参数类型不能省略
- 返回值类型可以省略,由scala编译器自动推断
- 返回值可以不写return,默认就是{}块表达式的值

方法的参数

默认参数:在定义方法时可以给参数定义一个默认值。

带名参数:在调用方法时,可以指定参数的名称来进行调用。

  def method1(v1:Int, v2: Int)= {v1 + v2}def method2(v1:Int = 12, v2:Int = 13) = {  // 可以指定默认值v1 + v1 + v2}def main(args: Array[String]): Unit = {println(method1(3,5))println(method2(v2=12, v1=10))   // 可以带变量名赋值}

运行结果:

注意:如果定义递归方法,不能省略返回值类型


5.2 函数

Scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数

语法

val 函数变量名 = (参数名:参数类型) => 函数体

注意

- 函数是一个变量,长的与方法相似,但不同于方法
- 类似于方法,函数也有输入参数和返回值
- 函数定义不需要使用def定义,而是用val定义
- 无需指定返回值类型

  val function1 = (v5:Int) =>{println(v5)}def main(args: Array[String]): Unit = {function1(8)}

5.3 case class

1. 创建 case class 和它的伴生 object

2. 实现了 apply 方法让你不需要通过 new 来创建类实例

3. 添加天然的 hashCode、equals 和 toString 方法。由于 == 在 Scala 中总是代表 equals,所以 case class 实例总是可比较的
4. 默认为主构造函数参数列表的所有参数前加 val

case class demo2(v1: Int)

6. 高阶函数

使用函数值作为参数,或者返回值为函数值的“函数”和“方法”,均称之为“高阶函数”

意义:将实际数据,与执行动作进行解耦

7. 函数式编程

理念:数据与动作的解耦

原理:类的实例当做参数传入

我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程

“函数式编程"是一种"编程范式”(programming paradigm)

**函数式编程**是从编程方式(范式)的角度来谈的,可以这样理解:函数式编程把函数当做一等公民,**充分利用函数**、 支持的函数的多种使用方式,主要思想是把运算过程尽量写成一系列嵌套的函数调用

[集合的分类](https://zhuanlan.zhihu.com/p/25512292)

**foreach**

(学会认识方法,要怎么传递参数)

方法描述:接收一个函数对象,函数的输入参数为集合的元素

需要传入一个函数类型A 返回是一个空

foreach(f: (A) => Unit): Unit

示例

  // 函数的意义:数据跟动作做解耦def testForeach(): Unit = {val list = List(1,2,3,4,5)val f = (x: Int) => print(x)list.foreach(f)// 简便写法list.foreach((x:Int) => print(x))list.foreach(x => print(x))list.foreach(println(_))  // 下划线代表每一个元素list.foreach(println)}

**映射 - map**

集合的映射操作是将来在编写Spark/Flink用得最多的操作,是我们必须要掌握的掌握。

方法描述:传入一个函数对象,该函数接收一个类型A,返回值为类型B

def map[B](f: (A) ⇒ B): TraversableOnce[B]

示例

  def mapTest(): Unit = {val list = List(1,2,3,4,5)val list2: List[String] = list.map((x:Int) => x.toString)val list3: List[String] = list.map(x => x.toString)val list4: List[String] = list.map(_.toString)val list5: List[Int] = list.map(_ + 1)print(list5)}def main(args: Array[String]): Unit = {mapTest()}

隐式转换:

通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码

**扁平化映射 - flatmap**

映射扁平化也是将来用得非常多的操作,也是必须要掌握的。

方法描述:[B]最终要转换的集合元素类型,传入一个函数对象,函数的参数是集合的元素,函数的返回值是一个集合

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): TraversableOnce[B]

示例 可以理解为读取一行数据

~~~scala

~~~

### **过滤 - filter**

方法描述:传入一个函数对象,接收一个集合类型的参数,返回布尔类型,满足条件返回true, 不满足返回false

```scala
def filter(p: (A) ⇒ Boolean): TraversableOnce[A]
```

方法实操:

~~~scala

~~~

### **排序 - sort**

在scala集合中,可以使用以下几种方式来进行排序

#### sorted默认排序 

演示

~~~~scala

~~~~

#### **sortWith自定义排序**

自定义排序,根据一个函数来进行自定义排序

方法描述

~~~scala
def sortWith(lt: (A, A) ⇒ Boolean): List[A]
~~~

方法实操

~~~scala

~~~

**tip:元组**

就是为了操作方便,而给我们提供的一个类型,可以存放不同数据类型在一个元组中。可以理解为可以存放不同类型数据的一个list

### **分组 - groupBy**

我们如果要将数据按照分组来进行统计分析,就需要使用到分组方法,groupBy表示按照函数将列表分成不同的组

方法描述

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]

方法实操

  def groupTest(): Unit = {val list = List(("jack", 2000), ("tom", 2500), ("tom", 5600))val res = list.groupBy(_._1).mapValues(_.map(_._2)).map(x => x._1 + x._2.sum)print(res)}def main(args: Array[String]): Unit = {groupTest()}

### **聚合 - reduce**

reduce表示将列表,传入一个函数进行聚合计算

方法描述

~~~scala
def reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1
~~~

方法说明

| reduce方法 | API               | 说明                                                         |
| ---------- | ----------------- | ------------------------------------------------------------ |
| 泛型       | [A1 >: A]         | (下界)A1必须是集合元素类型的子类                           |
| 参数       | op: (A1, A1) ⇒ A1 | 传入函数对象,用来不断进行聚合操作<br />第一个A1类型参数为:当前聚合后的变量<br />第二个A1类型参数为:当前要进行聚合的元素 |
| 返回值     | A1                | 列表最终聚合为一个元素                                       |

scala _ 下划线用法

- 作为“通配符”,类似Java中的*

- 指代一个集合中的每个元素

- 在元组中,可以用方法1, _2, _3访问组员

- 使用模式匹配可以用来获取元组的组员

- 下划线_代表的是某一类型的默认值

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆&#xff0c;第i个房间有J[i] 磅的五香豆&#xf…

复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization

论文&#xff1a;[2403.16697] DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization github: TYLfromSEU/DPStyler: DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization 论文: 这篇论文还是在PromptStyler:Prompt-driven Style Gener…

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…

TikTok账户安全指南:如何取消两步验证?

TikTok账户安全指南&#xff1a;如何取消两步验证&#xff1f; 在这个数字化的时代&#xff0c;保护我们的在线账户安全变得尤为重要。TikTok&#xff0c;作为全球流行的社交媒体平台&#xff0c;其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施&#xff0c;虽…

详解分布式ID实践

引言 分布式ID&#xff0c;所谓的分布式ID&#xff0c;就是针对整个系统而言&#xff0c;任何时刻获取一个ID&#xff0c;无论系统处于何种情况&#xff0c;该值不会与之前产生的值重复&#xff0c;之后获取分布式ID时&#xff0c;也不会再获取到与其相同的值&#xff0c;它是…

react 踩坑记 too many re-renders.

报错信息&#xff1a; too many re-renders. React limits the number of randers to prevent an infinite loop. 需求 tabs只有特定标签页才展示某些按钮 button要用 传递函数引用方式 ()>{} *还有要注意子组件内loading触发 导致的重复渲染

【干货教程】Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

关于YApi接口操作

YApi有 接口集合 和 测试集合 两个概念。 接口集合 将接口进行分类&#xff0c;使接口结构更清晰&#xff0c;一个接口只能属于一个集合&#xff0c;且不允许与其他接口重名。测试集合 为了方便我们测试接口&#xff0c;测试集合 将若干接口组合在一起&#xff0c;在这里一个接…

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…

Django简介

Django是什么 Web应用程序是指在服务器端运行的程序&#xff0c;不需要单独安装&#xff0c;而Django就是其中一个非常流行的框架。 网站运行的主要原理 网站运行的本质就是服务器与客户端之间的数据传输&#xff0c;而其中&#xff0c;超文本传输协议&#xff08;HTTP&…

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…

1.21作业

1 unserialize3 当序列化字符串中属性个数大于实际属性个数时&#xff0c;不会执行反序列化 外部如果是unserialize&#xff08;&#xff09;会调用wakeup&#xff08;&#xff09;方法&#xff0c;输出“bad request”——构造url绕过wakeup 类型&#xff1a;public class&…

LLaMA-Factory|微调大语言模型初探索(3),qlora微调deepseek记录

前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …

TCP传输可靠性保障:理论讲解→实战面试解析

一、TCP为何需要可靠性保障&#xff1f; TCP作为互联网的"运输队长"&#xff0c;承担着80%以上的网络数据传输任务。其核心使命是&#xff1a;在不可靠的IP层之上&#xff0c;构建端到端的可靠传输通道。 想象一下网购时商品运输需要防丢包、防损坏、防错序&#xff…

一篇搞懂vue3中如何使用ref、reactive实现响应式数据

ref 可实现 基本类型、对象类型响应式数据 reactive&#xff1a;只能实现 对象类型响应式 ref实现 基本类型 数据响应式&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ ag…

Linux 内核自旋锁spinlock(四)--- queued spinlock

文章目录 前言一、queued spinlock1.1 简介1.2. spin_lock/spin_unlock 二、源码解析2.1 struct qspinlock2.2 struct qnode2.3 queued_spin_lock2.3.1 快速申请通道CPU0申请锁 2.3.2 慢速申请通道CPU0/1申请锁CPU0/1/2申请锁CPU0/1/2/3申请锁 queued_spin_lock_slowpath总结 2…

一种最常见的js加密解密

前言 在前端开发的广袤天地中&#xff0c;你是否遭遇过一些看似“乱码”般的代码&#xff0c;根本无从下手理解&#xff1f;这其实很可能是被 _0x处理过的代码。_0x就像一位神秘的“化妆师”&#xff0c;能把原本清晰的代码改头换面。今天&#xff0c;我就来分享如何破解这些被…

git使用-克隆远程项目、分支管理

文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目&#xff0c;复制ssh地址2. idea开启git版本控制&#xff08;如果已经开了&#xff0c;忽略此步骤&#xff09;3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…