Spark-Scala语言实战(5)

news/2024/5/11 0:29:18

在之前的文章中,我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-Scala语言实战(4)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_49513817/article/details/136881756?spm=1001.2014.3001.5501

目录

一、知识回顾

二、Scala类与对象

1.类(Class)和对象(Object)

Person类:

PersonApp对象:

2.构造器(Constructor)

PersonApp对象:

局部类Person:

对象创建和方法调用:

3.伴生对象(Companion Objects)

三、例题演练

 1、定义一个高阶函数

2、定义一个高阶函数

3、对数据中的元素按照指定规则进行分组

4、根据指定规则对数组所有元素聚合

拓展-类和对象


一、知识回顾

 在上一篇函数中,我们学习了集合,创建集合的方法有三种,分别是List、Set和map

 

 

 而我们的元组,则不需要用特殊的关键字,可以直接创建

 现在,开始今天的学习吧

二、Scala类与对象

1.类(Class)和对象(Object)

 类定义了对象的属性和方法。在Scala中,我们可以使用class关键字来定义一个类。而对象是类的实例,我们可以使用new关键字来创建类的对象。

例:

package com.tipdm.scalaDemoobject PersonApp {def main(args: Array[String]): Unit = {// 创建Person对象val peng = new Person// 设置属性peng.name = "peng"peng.age = 18// 调用方法peng.introduce()  // 应该输出: Hello, my name is peng and I am 18 years old.}
}class Person {var name: String = _var age: Int = _def introduce(): Unit = {println(s"Hello, my name is $name and I am $age years old.")}
}

在我的代码中,我运用到了:

  1. Person类
    • 定义了一个名为Person的类。
    • 类中有两个变量(属性):name(表示人的名字)和age(表示人的年龄)。这两个变量都被初始化为占位符_,表示它们可以在创建对象后被赋予具体的值。
    • 类中定义了一个方法introduce,这个方法没有参数,返回类型为Unit(相当于Java中的void)。当调用这个方法时,它会打印出一条包含nameage属性值的问候信息。
  2. PersonApp对象
    • 定义了一个名为PersonApp的单例对象。在Scala中,单例对象类似于Java中的静态类或单例类,用于包含程序的入口点或其他共享功能。
    • PersonApp对象中包含一个main方法,这是Scala应用程序的入口点。当你运行Scala程序时,JVM会调用这个main方法开始执行程序。
    • main方法中,首先创建了一个Person类的实例peng
    • 然后,通过peng对象设置了name属性为"peng"age属性为18
    • 最后,调用了peng对象的introduce方法,该方法会打印出一条问候信息,内容应该是:“Hello, my name is peng and I am 18 years old.”。

看一下输出吧

2.构造器(Constructor)

 Scala的类可以有一个或多个构造器,它们用于初始化对象的属性。在Scala中,主构造器的参数直接定义在类定义中,而辅助构造器使用this关键字来调用。

package com.tipdm.scalaDemoobject PersonApp {def main(args: Array[String]): Unit = {class Person(val name: String, val age: Int) {def introduce(): Unit = {println(s"Hello, my name is $name and I am $age years old.")}}val bob = new Person("peng", 18)bob.introduce() // 输出: Hello, my name is peng and I am 18 years old.}
}

在以上代码中,我的方法是:

  1. PersonApp对象
    • 定义了一个名为PersonApp的单例对象,它是程序的入口点。
    • PersonApp对象内部定义了main方法,这是Scala应用程序的入口点。
  2. 局部类Person
    • main方法内部定义了一个局部类Person。这个类接受两个参数:name(表示人的名字)和age(表示人的年龄)。这两个参数被声明为val,意味着它们是不可变的,并且在对象创建时就需要被初始化。
    • 类中定义了一个方法introduce,用于打印出一条包含nameage属性值的问候信息。
  3. 对象创建和方法调用
    • main方法中,创建了一个Person类的实例bob,并传入了名字"peng"和年龄18作为构造参数。
    • 接着调用了bob对象的introduce方法,该方法会打印出一条问候信息。

3.伴生对象(Companion Objects)

 在Scala中,每个类都有一个与之关联的伴生对象。这个对象与类共享相同的名称,并且它的定义位于类定义的外部。伴生对象可以包含静态方法或字段,这些方法和字段可以通过类名直接访问。

package com.tipdm.scalaDemoobject PersonApp {object PersonUtils {def greet(name: String): Unit = {println(s"Hello, $name!")}}class Person(val name: String) {def introduce(): Unit = {println(s"My name is $name.")}}
}object Main {def main(args: Array[String]): Unit = {PersonApp.PersonUtils.greet("peng") //val charlie = new PersonApp.Person("peng")charlie.introduce()}
}

看下输出:

三、例题演练

 1、定义一个高阶函数(1

按照指定的规则对集合里面的每个元素进行操作 比如: Array(“hh”,“red”,“java”,“hadoop”) 规则: 对集合中每个元素进行操作,得到集合每个元素的长度

package com.tipdm.scalaDemoobject p6 {def main(args: Array[String]): Unit = {def ppp(arr: Array[String]): Array[Int] = {arr.map(element => element.length)}val array = Array("hh", "red", "java", "hadoop")val lengths = ppp(array)val p = lengths.toList // 将数组转换为列表println(p) // 输出: List(2, 3, 4, 6)}
}

 

2、定义一个高阶函数(2

对数据中的元素按照指定的规则进行过滤 比如: Array(1,4,7,9,10,6,8,99,88,66) 规则: 只保留偶数数据

package com.tipdm.scalaDemoobject p6 {def main(args: Array[String]): Unit = {def peng(arr: Array[Int]): Array[Int] = {arr.filter(number => number % 2 == 0)}val numbers = Array(1, 4, 7, 9, 10, 6, 8, 99, 88, 66)val ppp = peng(numbers)val p1 = ppp.toList // 将数组转换为列表println(p1) // 输出: List(4, 10, 6, 88, 66)}
}

 

3、对数据中的元素按照指定规则进行分组

比如:Array(“zhangsan shenzhen man”,“lisi beijing woman”,“zhaoliu beijing man”) 规则: 按照地址进行分组

package com.tipdm.scalaDemoobject p6 {def main(args: Array[String]): Unit = {def p1(arr: Array[String]): Map[String, List[String]] = {arr.groupBy(person => person.split(" ")(1)).mapValues(_.toList) // 将每个地址对应的数组转换为列表}val people = Array("zhangsan shenzhen man", "lisi beijing woman", "zhaoliu beijing man")val newp1 = p1(people)println(newp1)}
}

.mapValues(_.toList): 由于groupBy返回的映射的值是数组,所以这里使用mapValues方法来转换这些数组为列表。_.toList是一个简短的lambda表达式,它接受一个数组并返回该数组的列表形式。

4、根据指定规则对数组所有元素聚合

比如:Array(10,4,6,10,2) 规则: 求和/求乘积

求和
package com.tipdm.scalaDemoobject p6 {def main(args: Array[String]): Unit = {def peng(arr: Array[Int]): Int = {arr.sum}val pp = Array(10, 4, 6, 10, 2)val sum = peng(pp)println(sum) // 输出: 32}
}求乘积
package com.tipdm.scalaDemoobject p6 {def main(args: Array[String]): Unit = {def peng(arr: Array[Int]): Int = {arr.product}val pp = Array(10, 4, 6, 10, 2)val product = peng(pp)println(product) // 输出: 4800}
}

拓展-类和对象

示例

方法名称描述
__init__构造函数,用于初始化对象的状态。在创建对象时自动调用。
get_attribute获取对象的某个属性值。
set_attribute设置对象的某个属性值。
do_action执行某个操作或任务,可能涉及修改对象的状态或与其他对象交互。
is_condition_met检查对象的某个条件是否满足,并返回布尔值。
calculate_result执行计算并返回结果。
compare_to将当前对象与另一个对象进行比较,并返回比较结果。
to_string将对象转换为字符串表示形式。

http://www.mrgr.cn/p/52208381

相关文章

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…

不启动BMIDE,Teamcenter如何查看property的real property name

问题描述&#xff1a; Teamcenter客户端&#xff0c;查看Item 属性&#xff0c;属性名称默认显示的是Display Name。 在各类开发过程中&#xff0c;对属性的操作&#xff0c;需要使用real property name才能进行。开发可能不在server端&#xff0c;没有安装BMIDE&#xff0c;如…

机器学习——元学习

元学习&#xff08;Meta Learning&#xff09;是一种机器学习方法&#xff0c;旨在使模型能够学习如何学习。它涉及到在学习过程中自动化地学习和优化学习算法或模型的能力。元学习的目标是使模型能够从有限的训练样本中快速适应新任务或新环境。 在传统的机器学习中&#xff…

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的…

第三天-centos配置静态IP

跟着无涯老师学习安全知识的一天,今天遇到点问题。给新创建的centos配置静态IP的时候,可能是网卡配置文件里的内容修改或添加的不对,配置完之后网络不通。尝试了几次都没成功,明天再试试吧,今天就记这几个简单的命令,加油,晚安。

线程创建方式、构造方法和线程属性

欢迎各位&#xff01;&#xff01;&#xff01;推荐PC端观看 文章重点&#xff1a;学会五种线程的创造方式 目录 1.开启线程的五种方式 2.线程的构造方法 3.线程的属性及获取方法 1.开启线程的五种方式 创造线程的基本两步&#xff1a;&#xff08;1&#xff09;使用run方法…

学习笔记:NATS--自适应边缘和分布式系统的连接技术。(更新中)

基于NATS英文官方文档的学习,我将使用简单易懂的语言去解释NATS的各种机制及其原理。预计在一个月内,也就是在5月之前完成对NATS官方文档的笔记。大家可以将此笔记当做官方文档的中文低配版来学习。欢迎大家的阅读,也希望各位指出我笔记中可能存在的各种错误。目录1. NATS: …

【数据结构】顺序表的实现——静态分配

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

TOP100-回溯(二)

4.39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制…

AIR780E引脚复用笔记

1、应用场景:使用AIR780E模块驱动TM1637数码管驱动芯片,原有方案是AIR724UG+TM1637。为了降低成本,按照官方方案进行代码迁移。伴随着代码迁移,硬件引脚也需要做相应调整。由于其他引脚已经分配了对应的功能,仅剩余I2C引脚未使用,所以需要把I2C引脚【PIN66 PIN67】作为普…

Excel·VBA数组平均分组问题

看到一个帖子《excel吧-数据分组问题》&#xff0c;对一组数据分成4组&#xff0c;使每组的和值相近 上一篇文章《ExcelVBA数组分组问题》&#xff0c;解决了这个帖子问题的第1步&#xff0c;即获取所有数组分组形式的问题 接下来要获取分组和值最相近的一组&#xff0c;只需计…

Docker搭建私有仓库

因为dockerHub公共仓库是外网的&#xff0c;所以访问就特别慢&#xff0c;所以一般公司都会搭建私人的镜像仓库来保存镜像。一台服务上用docker开启一个私有仓库的镜像&#xff0c;后续其他的docket服务器都将镜像保存在这个私有的仓库 1 设置私有镜像仓库 # 下载镜像 docker…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

腾讯云Ubuntu远程接入Vscode并设置root免密码登录

最近在尝试Linux编程,想起自己还有一个腾讯云的服务器,就重装了Ubuntu,然后装了环境之后尝试用Vscode连接,但是发现用root用户无论如何都登录不上,后来把用户名换成ubuntu之后就能登录上了,但是在VsCode上写代码时又出现了很多问题。 1、某些文件夹打不开,后来发现是用户…

LeetCode每日一题——移除链表元素

移除链表元素OJ链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 这与之前的移除元素的题目很相似&#xff0c;那么我们同样可以用类似的做法&#xff08;双指针&#xff09;进行解题。但是这是一个链表删除&a…

element-ui checkbox 组件源码分享

简单分享 checkbox 组件&#xff0c;主要从以下三个方面来分享&#xff1a; 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性&#xff0c;绑定的值&#xff0c;类型 string / number / boolean&#xff0c;无…

java注解的实现原理

首先我们常用的注解是通过元注解去编写的&#xff0c; 比如&#xff1a; 元注解有Target 用来限定目标注解所能标注的java结构&#xff0c;比如标注方法&#xff0c;标注类&#xff1b; Retention则用来标注当前注解的生命周期&#xff1b;比如source&#xff0c;class&…

后处理 - 均值模糊

原理 就是取自身以及该像素周围的8个像素的颜色值相加,然后除9取个平均值,得到最终颜色值效果因为模糊后会出现一些方形的像素效果,模糊效果不是很平均,所以均值模糊也叫做盒状模糊。c#代码using UnityEngine;public class BoxBlurEff : MonoBehaviour {public Shader m_Sh…

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …