Spark-Scala语言实战(5)

在之前的文章中,我们学习了如何在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、定义一个高阶函数

按照指定的规则对集合里面的每个元素进行操作 比如: 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、定义一个高阶函数

对数据中的元素按照指定的规则进行过滤 比如: 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.mzph.cn/news/764730.shtml

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

相关文章

伪分布式部署Hive

文章目录 1 Hadoop 伪分布式安装1 Hive下载2 Hive配置3 安装MySQL JDBC连接器4 连接Hive CLI4.1 初始化数据库4.2 连接Hive 1 Hadoop 伪分布式安装 假设我们已经安装好hadoop伪分布式 1 Hive下载 Hive下载地址 2 Hive配置 Hive伪分布式需要在conf文件夹下修改两个文件&…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码 4.6.1继承的基本语法…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云,开发QT5.14.0VTK9.2.0的上位机软件,用于对结构光3D相机进行控制,并接收传输回来的3D数据,显示在窗口中。 配置QT和VTK VTK9.2.0下载源码,用Cmake编译,编译好的VTK9.2.0…

去中心化的 AI 数据供应:认识Grass,参与Grass

去中心化的 AI 数据供应:认识Grass,参与Grass 👋:邀请链接☘️:Intro❓:看好Grass和即将推出的L2的原因有哪些?💡:展望🔍:总结 👋&…

说说webpack的构建流程?

文章目录 一、运行流程初始化流程编译构建流程compile 编译make 编译模块build module 完成模块编译 输出流程seal 输出资源emit 输出完成 二、小结参考文献 一、运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块:即管理员模块和学生、教师模块,主要功能包括:学生、教师、作业信息、学习模块、教学评价、学习情况等; 关键词:学生作业管理系统;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

5.84 BCC工具之tcpretrans.py解读

一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数; 2.绘制线性和非线性边界; 3.编写线性核函数 二、算法 1.线性svm: 分离超平面:wxb0,对于线性可分的数据集来说,这样的超平面有无穷多个(…

ARM32day4

VID_20240319_210515 1.思维导图 2.实现三个LED灯亮灭 .text .global _start _start: 使能GPIO外设时钟 LDR R0,0x50000A28 LDR R1,[R0]使能GPIOE ORR R1,R1,#(0X1<<4)使能GPIOF ORR R1,R1,#(0X1<<5) STR R1,[R0]设置引脚状态 LDR R0,0X50006000 LDR R1,[R0…

SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。 这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法&#xff08;执行平台Impala&#xff09; 目录 OVER函数1、不加条件的OVER函数——得到所有的汇总结果2、仅有排序的OVER函数——得到按顺序…

基于NetCoreServer的WebSocket客户端实现群播(学习笔记)

一、NetCoreServer介绍 超快速、低延迟的异步套接字服务器和客户端 C# .NET Core 库&#xff0c;支持 TCP、SSL、UDP、HTTP、HTTPS、WebSocket 协议和 10K 连接问题解决方案。 开源地址&#xff1a;https://github.com/chronoxor/NetCoreServer 支持&#xff1a; Example: TC…

34 vue 项目默认暴露出去的 public 文件夹 和 CopyWebpackPlugin

前言 这里说一下 vue.config.js 中的一些 public 文件夹是怎么暴露出去的? 我们常见的 CopyWebpackPlugin 是怎么工作的 ? 这个 也是需要 一点一点积累的, 因为 各种插件 有很多, 不过 我们仅仅需要 明白常见的这些事干什么的即可 当然 以下内容会涉及到一部分vue-cli,…

Android基础面试题目汇总

一. Android面试相关 1.Activity 说下Activity生命周期​​​​​​onStart 和 onResume、onPause 和 onStop 的区别onSaveInstanceState(bundle),onRestoreInstanceState(bundle)什么时候调用?Activity的onNewIntent(intent)方法什么时候会调用?Activity A跳转Activity B…

Python 10个面试题实例

当然&#xff01;以下是10个Python面试题及其示例解决方案的中题目&#xff1a; 1.反转字符串: string "Hello, World!" reversed_string string[::-1] print(reversed_string)2.检查字符串是否为回文: def is_palindrome(string):return string string[::-1]r…

Xcode15报错: SDK does not contain ‘libarclite‘

pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…

Linux 系统中 NumPy (Python 2) 编程环境

Linux 系统中 NumPy [Python 2] 编程环境 1. Installation2. NumPy 版本3. NumPy 目录 - /home/strong/.local/lib/python2.7/site-packages/numpy/core/include4. NumPy 目录 - /usr/local/lib/python2.7/dist-packages/numpy/core/include5. sudo pip install numpy6. sudo a…

Vue2(九):尚硅谷TodoList案例(初级版):组件化编码流程的使用

一、组件化编码流程及资料 百度网盘 请输入提取码 提取码yyds &#xff08;Vue全家桶资料&#xff09; 组件化编码流程分为三步&#xff1a; 二、实现静态组件 1、分析结构 确定组件名称&#xff08;Header,List,Item,Footer&#xff09;和个数&#xff0c;还有嵌套关系(…

阿里云服务器租用一年多少钱?2024年最新阿里云租用价格

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

5.3.2、【AI技术新纪元:Spring AI解码】Stability AI 图像生成

Stability AI 图像生成 Stability AI 图像生成前提条件自动配置图像生成属性连接属性图像生成客户端配置属性运行时选项Stability AI 图像生成 Spring AI 支持 Stability AI 的文本到图像生成模型。 前提条件 要访问 Stability AI 的 AI 模型,您需要从 Stability AI 创建一…

深入了解Flutter中Future的全部工厂方法及使用

在Flutter中&#xff0c;Future是一种表示异步操作结果的对象。它代表了一个可能已经完成或尚未完成的计算&#xff0c;可以用来处理异步任务。Flutter提供了多种工厂方法来创建Future对象&#xff0c;每种方法都有其特定的用途和优势。在本文中&#xff0c;我们将深入探讨Flut…