Scala基础(四)

文章介绍了Scala语言的基础知识,包括如何定义类和对象,展示了类的继承以及单例模式的实现。此外,还讲解了模式匹配的概念,给出了变量和列表模式匹配的示例。最后,提到了文件的读写操作,包括使用PrintWriter写入文件和Source类读取文件内容。
摘要由CSDN通过智能技术生成

1.定义Scala类

Scala是一种纯粹的面向对象语言,面向对象语言有两个重要的概念:类和对象。

其中,类是对象的抽象,也可以把类理解为模板,对象才是真正的实体。

一般定义类的格式如下:

class ClassName(参数列表) extends t {}

一个Scala源文件中可以有多个类,并且Scala类可以有参数。

一般,Scala类名的第一个字母需要大写,如果需要使用几个单词构成一个类的名称,那么每个单词的第一个字母都要大写。

与Java等其他语言不同的是,Scala中的类不定义为public。

【例】定义一个Point,计算二维坐标点移动后的坐标

#代码2-19 定义类Point
class Point(xc: Int, yc: Int) {
    var x: Int = xc
    var y: Int = yc
    def move(dx: Int,dy: Int) {
        x = x + dx
        y = y + dy
        println("x的坐标点为:" + x)
        println("y的坐标点为:" + y)
    }
}

在这里插入图片描述

分析:类的名称是Point,包含两个参数(Int类型),类里面定义了一个方法move()

【例】实例化类并使用new调用Point类中的方法

# 实例化Point类,调用move()方法将坐标为(1,2)的点向右移动2位,向上移动3new Point(1, 2).move(2, 3)

在这里插入图片描述

执行结果:将坐标为(1,2)的点,向右移动2位,向上移动3位,得到新的坐标点(3,5)

Scala类继承一个类时需要使用关键字extends

定义一个类Location,该类继承了Point类,Point为父类,Location是子类

【例】Scala继承示例

class Location(val xc: Int,val yc: Int,val zc: Int) extends Point(xc, yc) {
    var z: Int = zc
    def move(dx: Int, dy: Int, dz: Int) {
        x = x + dx
        y = y + dy
        z = z + dz
        println("x 的坐标点 : " + x);
        println("y 的坐标点 : " + y);
        println("z 的坐标点 : " + z);
    }
}

Scala只允许继承一个父类,并且继承父类的所有属性和方法。

子类继承父类中已经实现的方法时,需要使用override关键字,子类继承父类中未实现的方法时,可以不用override关键字。

【例】override关键字的使用

abstract class Father {
def fun1 = 1
def fun2: Int
}
class Child extends Father {
override def fun1 = 2
def fun2 = 1
}

2.使用scala单例模式

​ scala中没有static关键字,所以scala的类中不存在静态成员。但是可以使用object关键字实现单例模式。

Scala中使用单例模式时需要使用object定义一个单例对象(object对象),单例对象在整个程序中只有一个实例。

单例对象与类的区别在于单例对象不能带参数。

定义单例对象的语法格式如下:

object ObjectName()

【例】定义单例对象Person

object Person {
    val age = 10
    def getAge = age
}

在这里插入图片描述

包含main()方法的单例对象可以作为程序的入口点。

当单例对象与某个类共享同一个名称时,单例对象被称为这个类的伴生对象,类被称为这个单例对象的伴生类。

类和它的伴生对象可以相互访问对象的私有成员。注意:需要在同一个源文件中定义类和它的伴生对象。

【例】伴生类和伴生对象

定义Person类,类中包含私有成员name和私有方法getSkill(),再定义类的伴生对象,伴生对象访问了伴生类的私有成员和私有方法,而伴生类访问了伴生对象的私有成员skill。

class Person private(val name: String) {
    private def getSkill() = name+"s skill is:" + Person.skill
}
object Person {
    private val skill = "basketball"
    private val person = new Person("Tracy")
    def printSkill = println(person.getSkill())
    def main(args: Array[String]): Unit = {
        Person.printSkill
    }
}

3.使用Scala模式匹配

Scala具有强大的模式匹配机制,Scala模式匹配的一般形式为“选择器match{备选项}”。

  • 一个模式匹配包含一系列备选项,每个备选项都开始于关键字case。
  • 每个备选项都包含一个模式、一到多个表达式。
  • 模式和表达式之间使用“=>"隔开。

【例】变量模式匹配示例

定义一个函数matchTest,函数的参数为一个Int类型变量,函数体的功能是对参数进行模式匹配。若参数匹配到的是1,则输出one,匹配到的是2,则输出two;匹配到初1和2以外的其他值,则输出many。

def matchTest(x: Int) = x match {
    case 1 => println("one")
    case 2 => println("two")
    case _ => println("many")
}

在这里插入图片描述

【例】列表模式匹配示例

def matchTest(x: List[Int]) = x match {
    case List(0, _, _) => println("列表x有3个元素并且第一个元素是0")
    case List(1, _*) => println("列表x有任意个元素并且第一个元素是1")
    case List(_, 1, _*) => println("列表至少有两个元素并且第二个元素是1")
}

在这里插入图片描述

在Scala中,使用case关键字定义的 类称为样例类。

【例】样例类

case class Person(name: String,age: Int)
	val alice = new Person("Alice", 25)
	val bob = new Person("Bob", 22)
	val mike = new Person("mike", 24)
for(person <- List(alice, bob, mike)) {
    person match {
        case Person("Alice", 25) => println("Hi, Alice!")
        case Person("Bob", 22) => println("Hi, Bob!")
        case Person(name, age) => println("name:" + name + "\t" + "age:" + age)
    }
}

在这里插入图片描述

Scala编译器为样例类添加了一些语法上的便捷设定,具体如下:

  1. 在伴生对象中提供了apply()方法,因此不使用new关键字也可以构造对象。
  2. 样例类参数列表中的所有参数已隐式获得val关键字。
  3. 编译器为样例类添加了toString()、hashCode()和equals()等方法。

4.读写文件

在实际的实践中,常常需要涉及文件的读写操作。

Scala不提供任何特殊文件写入能力,所以进行文件的写操作使用的是Java的I/O类中的PrintWriter来实现。

【例】Scala写入文件:将”I amlearning Scala"写入/opt/scala目录下的test.txt文件中

import java.io._
val pw = new PrintWriter(new File("/opt/scala/test.txt"))
pw.println("I am learing Scala")
pw.close

在这里插入图片描述

有时候需要接收用户在屏幕上输入的指令来处理程序,这时可以使用StdIn.readLine接收用户输入的指令。

用户可以在REPL中直接输入“StdIn.readLine”命令并按“Enter”键,并在屏幕上输入指令;也可以将StdIn.readLine赋值给一个变量,用户在屏幕上输入的内容即可赋值给该变量。

使用scala的Source类读取文件内容

【例】Scala读取文件数据

import scala.io.Source
Source.fromFile("/opt/scala/test.txt").foreach{print}

在这里插入图片描述

5.任务实现

任务描述:

  • 筛选某个地区的所有手机号码段。
  • 首先需要根据地区对手机号码段进行分组。
  • 再根据地区取出该分组内的所有手机号码段。

读取表中的内容,编写程序完成手机号码归属地信息查询。

  1. 读取完整数据,编写程序完成手机号码归属地信息查询。将2020phonelocation.txt文件上传至Linux虚拟机的**/opt/scala**目录下。
  2. 首先使用object定义一个单例对象Phone,在该对象中定义一个checkPhone方法,读取完整的数据,并将数据存储在一个列表中,使用Console.readLine接收用户输入的指令,用户在屏幕上输入要查询的手机号码段,程序接收到屏幕上的指令之后遍历存储数据的列表,若列表中某个元素包含该指令则输出该元素。
import scala.io.StdIn
import scala.io.Source
object Phone {
    def checkPhone() {
        val phone = for(line <- Source.fromFile("/opt/scala/2020phonelocation.txt").getLines) yield line
        val phoneList: List[String] = phone.toList
        var num: String = StdIn.readLine
        for(line <- phoneList; if line.contains(num)) {println(line)}
    }
}

在这里插入图片描述

调用单例对象Phone中的checkPhone方法,在屏幕上输出一个手机号码段

import Phone.checkPhone

checkPhone

在这里插入图片描述

输入六位号码段:如115036(号码不显示,输入完直接按“Enter”键回车)

在这里插入图片描述

Z_Data
关注 关注
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
博客
面向对象程序设计——第3章 案例
08-06 1149
用户通过键盘输入一个整数值,判断该数值是否为“水仙花数”。“水仙花数”是指一个3位数,其各位数的三次方和等于该数本身。例如:水仙花例如: 153是一个“水仙花数”,因为本案例程序运行的结果如图本案例的实现过程应满足以下要求。
博客
面向对象程序设计——单元3 流程控制与数组
08-06 556
程序设计的流程控制主要包括3种结构:顺序结构、选择结构和循环结构。其中,选择结构根据给定条件的判断结果来控制程序的流程,而循环结构可以减少重复书写代码的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构。优良的程序控制结构需要和合适的数据组织形式搭配使用,才能提升程序的运行效能,数组就是一种最常用的数据组织结构。本单元将介绍Java灵活、高效的选择结构、循环结构以及Java独特的数组结构。
博客
面向对象程序设计——单元2 Java语言基础
07-05 659
构成程序的最基本元素包括变量、常量和语句等。变量是指程序运行过程中其值可以被改变的量,比如表示不同班级学生平均成绩的变量;常量则是指程序运过程中,值不会发生变化的量,比如最常见的圆周率。无论是变量还是常量,在使用之前都要先为它们指定一个名字。而语句则是组成一段程序的最基本单元。本单元主要介绍 Java 的基本语法,包括标识符、保留字、变量、常量、数据类型、运算符和表达式等。
博客
面向对象程序设计——Java语言基础
06-25 885
构成程序的最基本元素包括变量、常量和语句等。变量是指程序运行过程中其值可以被改变的量,比如表示不同班级学生平均成绩的变量;常量则是指程序运过程中,值不会发生变化的量,比如最常见的圆周率。无论是变量还是常量,在使用之前都要先为它们指定一个名字。而语句则是组成一段程序的最基本单元。
博客
Ubuntu Linux操作系统——项目7 Shell编程基础
06-21 1090
​ 在Linux操作系统环境中,Shell不仅是常用的命令解释程序,还是高级编程语言。​ 用户可以通过编写Shell程序来完成大量自动化的任务。​ Shell可以互动地解释和执行用户输入的命令,也可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构。
博客
Ubuntu Linux操作系统——项目6 软件包安装配置与管理
06-14 827
在系统的使用和维护过程中,安装和卸载软件是必须掌握的技能。​ Linux软件的安装需要考虑软件的依赖性问题,目前在Linux系统上安装软件已经变得与Windows系统上一样便捷。​ 可供Linux安装的开源软件非常丰富,Linux提供多种软件安装方式,从最原始的源码编译到最高级的在线自动安装和更新。​ 在简单介绍Linux软件包管理知识的基础上,重点讲解Ubuntu系统的软件安装方式和方法,除了传统的Deb软件包安装,还讲解APT高级软件包工具以及Snap软件包安装,这种方式提供更好的隔离性和安全性
博客
Ubuntu Linux操作系统——项目5 系统高级配置与管理
04-25 974
进程:Linux系统上所有运行的任务都可以称之为一个进程,每个用户任务、每个应用程序或服务也都可以称之为进程,Ubuntu也不例外。对于管理员来说,没有必要关心进程的内部机制,而是要关心进程的控制管理。管理员应经常查看系统运行的进程服务,对于异常和不需要的进程,应及时将其结束,让系统更加稳定地运行。
博客
Ubuntu Linux操作系统——项目4 磁盘配置与管理
04-20 1600
对于任何一个通用操作系统而言,磁盘管理与文件管理都是必不可少的功能,因此,Linux操作系统提供了非常强大的磁盘与文件管理功能。Linux操作系统的管理员应掌握配置和管理磁盘的技巧,高效地对磁盘空间进行使用和管理。如果Linux服务器有多个用户经常存取数据,则为了有效维护用户数据的安全性与可靠性,应配置逻辑卷及RAID管理。本章主要讲解了磁盘管理、磁盘挂载与卸载、磁盘管理其他相关命令、配置管理逻辑卷以及RAID管理。
博客
Ubuntu Linux操作系统——项目3 用户群组与文件目录权限管理
04-19 1923
Ubuntu Linux是一个多用户、多任务的操作系统,可以让多个用户同时使用系统。为了保证用户之间的独立性,允许用户保护自己的资源不被非法访问,用户之间可以共享信息和文件,也允许用户分组工作,对不同的用户分配不同的权限,使每个用户都能各自不受干扰地独立工作,因此,作为系统的管理员,掌握系统配置、用户权限设置与管理、文件和目录的权限设置是至关重要的。本章主要讲解了用户账户、组群管理、su和sudo命令的使用以及文件和目录权限管理。
博客
Ubuntu Linux操作系统——项目2 Linux基本操作命令
04-18 924
Linux操作系统的Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。Shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,Shell就是围绕内核的外层。当从Shell或其他程序向Linux传递命令时,内核会做出相应的反应。Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中的其他应用程序所调用。用户在提示符下输入的命令都先由Shell解释再传给Linux核心。
博客
搭建Java开发环境
04-17 985
JDK 基本介绍JDK 的全称(Java Development Kit Java 开发工具包)JDK = JRE + java 的开发工具 [java, javac,javadoc,javap 等]JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。所以安装了 JDK,就不用在单独安装 JRE 了。JRE 基本介绍JRE(Java Runtime Environment Java 运行环境)JRE = JVM + Java 的核心类库[类]
博客
Ubuntu Linux操作系统——项目1 Ubuntu安装与基本操作
04-17 6777
选项,进入下一步。选择 硬件兼容性,这里选择默认的。
博客
Spark运行架构
04-12 1029
Spark Core包含Spark最基础和最核心的功能,当提及Spark运行架构时,就是指Spark Core的运行架构。本节首先介绍Spark的基本概念和架构设计,然后介绍Spark运行基本流程,最后介RDD 的设计与运行原理。
博客
Hadoop分布式计算框架(MapReduce)——案例实践:气象大数据离线分析
12-21 1756
数据格式由Year(年)、Month(月)、Day(日)、Hour(时)、Temperature(气温)、Dew(湿度)、Pressure(气压)、Wind dir.(风向)、Wind speed(风速)、Sky Cond.(天气状况)、Rain 1h(每小时降雨量)、Rain 6h(每6小时降雨量)组成。打包成功后,在项目的targer目录下找到编译好的bigdata-1.0-SNAPSHOT.jar包,然后将其上传至/home/hadoop/shell/lib目录下(没有相关目录可手动创建)
博客
Hadoop分布式计算框架(MapReduce)——MapReduce运行机制
12-21 206
它首先为Map任务发出请求,该请求优先级要高于Reduce任务的请求,这是因为所有的Map任务必须在Reduce的排序阶段能够启动前完成,直到有5%的Map任务已经完成时,为Roduce任务的请求才会发出。在Map任务和Reduce任务运行时,子进程和自己的父Application Master通过接口进行通信,默认每隔3s,任务通过这个接口向自己的Application Master报告进度和状态(包括计数器), Application Master会形成一个作业的汇聚视图。
博客
Hadoop分布式计算框架(MapReduce)—— MapReduce的编程模型
12-21 535
从MapReduce自身的命名特点可以看出,MapReduce由Map和Reduce两个部分组成。用户只需实现Mapper和Reducer两个抽象类,编写map和reduce两个函数,即可完成简单的分布式程序的开发。这就是最简单的MapReduce编程模型。
博客
Hadoop分布式计算框架(MapReduce)——初识MapReduce
12-21 220
MapReduce 是一个使用简单的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错式并行处理TB级别的数据集。MapReduce是一个并行程序的计算模型与方法MapReduce是一个并行程序运行的软件框架MapReduce是一个基于集群的高性能并行计算平台。
博客
案例实践:YARN调度器的配置与使用
09-28 603
以Hadoop自带的WordCount为例,操作演示公平调度器的配置与使用。
博客
YARN的调度器
09-28 397
理想情况下,YARN应用发出的资源请求应该立刻给予满足,然而在现实中,资源是有限的。在一个繁忙的集群上,一个应用经常需要等待才能得到所需要的资源。YARN调度器的工作就是根据既定策略为应用分配资源。
博客
YARN的高可用
09-28 303
HA表示高可用,YARN的HA主要指ResourceManager的HA,因为ResourceManager作为主节点存在单点故障,所以要通过HA的方式解决ResourceManager单点故障问题。
写文章

热门文章

  • NameNode详解 9724
  • Pygame安装教程及基本配置(详细图文) 9276
  • Ubuntu Linux操作系统——项目1 Ubuntu安装与基本操作 6724
  • 七面阿里:现在分享一下阿里最全面试120道题目 5338
  • stage,task和job的区别与划分方式 4952

分类专栏

  • 系统配置 2篇
  • Python 9篇
  • 工具 5篇
  • Linux 19篇
  • 计算机科学 4篇
  • 算法 1篇
  • 文档 127篇
  • 配置详情 21篇
  • Java 30篇
  • 大数据 121篇
  • 转载文档 3篇
  • MapReduce 32篇
  • HDFS 16篇
  • YARN 7篇
  • HA
  • hive 17篇
  • MySQL 8篇
  • Kafka 2篇
  • sqoop 6篇
  • HBASE 5篇
  • Scala 29篇
  • Spark 11篇

最新评论

  • Hadoop分布式计算框架(MapReduce)——案例实践:气象大数据离线分析

    Z_Data: out路径解释

  • Hadoop分布式计算框架(MapReduce)——案例实践:气象大数据离线分析

    Z_Data: 设置的文件输出路径,运行项目会自动生成

  • Hadoop分布式计算框架(MapReduce)——案例实践:气象大数据离线分析

    ugfhg13: 不是将数据集上传到weather目录了嘛,怎么找不到

  • Ubuntu Linux操作系统——项目1 Ubuntu安装与基本操作

    阿J~: 先一键三连,有空慢慢研究

  • Ubuntu Linux操作系统——项目1 Ubuntu安装与基本操作

    2301_77247661: thanks you

最新文章

  • 面向对象程序设计——第3章 案例
  • 面向对象程序设计——单元3 流程控制与数组
  • 面向对象程序设计——单元2 Java语言基础
2024年13篇
2023年20篇
2022年2篇
2021年4篇
2020年25篇
2019年11篇
2018年133篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家革命主题玻璃钢雕塑规定上海玻璃钢雕塑怎么样深圳商业商场美陈哪家好濮阳玻璃钢人物卡通雕塑广州玻璃钢花盆多少钱上海玻璃钢雕塑工程广州玻璃钢花盆定制洛阳商场美陈造景景区玻璃钢雕塑制作厂家河北玻璃钢雕塑生产商铜陵玻璃钢雕塑制作公司安徽公园玻璃钢雕塑优势池州景区玻璃钢雕塑哪家便宜玻璃钢花盆有前景吗吉林环保玻璃钢雕塑价位安徽玻璃钢牛动物雕塑厂家呼和浩特商场室外美陈咨询苏州仿真女孩造型玻璃钢雕塑西藏玻璃钢仿铜雕塑价格美陈商场摆件资阳玻璃钢雕塑价格玻璃钢熊本熊雕塑福建超市商场美陈怎么样玻璃钢三箫雕塑大旺玻璃钢抽象雕塑公司黑龙江玻璃钢人物雕塑陕西仿铜玻璃钢雕塑制作玻璃钢浮雕广场卡通雕塑设计海南玻璃钢金属雕塑价格句容美陈商场香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化