大数据编程语言 Scala 进阶篇
作者:幻好 来源: 恒生LIGHT云社区
Scala 系列:
2小时速学大数据编程语言 Scala 秘籍
大数据编程语言 Scala 进阶篇
前言
为了能够深入学习大数据框架 Spark 和 Fink 等大数据开源框架底层原理,就需要学会 Scala 编程语言。 本文将对 Scala 的进阶语法进行总结,以实例的方式帮助快速学会 Scala 语法,学会能够帮助你读懂相关开源框架的源码。
Scala面向对象编程
Scala 面向对象和 Java 的比较相似,都是单继承。类用 Class 修饰,对象用 Object 修饰,类是对象的抽象,对象是类的实例。
访问修饰符
Scala 的访问修饰符基本和 Java 的一样,分别有: public
, protected
, private
,再默认情况下,未指定的对象访问级别都是 public
。
public
public
修饰成员,能在任何地方都可以直接使用,理解下面实例即可
class Outer {class Inner {// 默认就是 public 修饰def fun() { println("fun do") }class InnerMore {fun() // 可以调用}}
}
protected
protected
只允许保护成员在定义了该成员的的类的子类中被访问,理解下列实例即可:
class Outer {protected def fun() {println("fun do")}
}
class Inner extends Outer {fun() // 只能子类访问
}
private
private
只能在包含了成员定义的类或对象内部可见,理解下列实例即可:
class Outer{class Inner{private def fun(){println("fun do")}class InnerMost{fun() // 可以调用}}
}
类
Scala 中的类是用于创建对象的蓝图,其中包含了方法、常量、变量、类型、对象、特质、类,这些统称为 成员 。 一个最简的类的定义就是关键字 class
+标识符,类名首字母应大写:
// 定义类
class Person// 通过类创建一个对象
val jack = new Person
当然实际开发中,一般不会去定义这么简单的类,通常会有构造器,成员等:
// 类的构造器是在传参就定义,数据类型不能省略
class Point(var _x : Int = 0, var _y : Int = 0) {private val bound = 100// getter 方法def x = _x// setter 方法,后面加上了 _=def x_=(newValue: Int): Unit = {if (newValue < bound) _x = newValue else printOutBoundWarn}def y = _ydef y_=(newValue: Int): Unit = {if (newValue < bound) _y = newValue else printOutBoundWarn}private def printOutBoundWarn = println("Warning: Out of bound")// toString覆盖了AnyRef中的toString方法,所以用了override关键字标记override def toString: String =s"($x, $y)"
}object ObjectClass {def main(args : Array[String]): Unit = {// 关键字new被用于创建类的实例var point : Point = new Pointpoint.x = 100println(point.toString)}
}
注意下对于setter方法的特殊语法:这个方法在getter方法的后面加上_=,后面跟着参数。
特质
特质 (Traits) 用于在类 (Class)之间共享程序接口 (Interface)和字段 (Fields)。
Traits 类似于Java 8的接口,类和对象 (Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。
特质的简单定义,关键字 trait
+标识符:
trait HairColor
为了更深刻的理解 trait
,以迭代器 Iterator
为例:
// 定义 Iterator 特质,A 为泛型
trait Iterator[A] {def hasNext: Booleandef next(): A
}
扩展
trait Iterator [A]
需要一个类型 A 和实现方法hasNext
和next
。
// 定义一个类继承 Iterator 特质,并扩展其成员方法
class IntIterator(to: Int) extends Iterator[Int] {private var current = 0override def hasNext: Boolean = current < tooverride def next(): Int = {if (hasNext) {val t = currentcurrent += 1t} else 0}
}val iterator = new IntIterator(10)
iterator.next() // returns 0
iterator.next() // returns 1
// 定义 Iterator 特质类型集合,但实现需要其子类
val list = List.empty[Iterator]
单例对象
Scala 中的单例对象是一种特殊的类,有且只有 一个 实例。它是一个惰性变量,单例对象是延迟创建的,当它第一次被使用时创建。
对象定义在一个类或方法中时,单例对象表现得和惰性变量一样。
定义一个单例对象和定义一个类的语法格式差不多:
object User
定义一个单例对象可以在其他任何地方复用,可以理解类似为 Java 中的静态对象
object Logger {def info(message: String): Unit = println(s"INFO: $message")
}class Test {info("Created projects")
}var test = new Test // Prints "INFO: Created projects"
伴生对象
Scala中的 伴生对象 指当一个单例对象和某个类共享一个名称的对象 。 同理,这个类被称为是这个单例对象的 伴生类 。类和它的伴生对象可以 互相访问其私有成员 。
使用伴生对象来定义那些在伴生类中不依赖于实例化对象而存在的成员变量或者方法。 Java 中
static
成员对应于 Scala 中的伴生对象的普通成员。
伴生对象的定义实例:
import scala.math._class Circle(radius: Double) {def area: Double = calculateArea(radius)
}// 对象可以直接访问类的私有成员 radius
object Circle {private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)
}val circle = Circle(5.0)
circle.area
注意:类和它的伴生对象必须定义在同一个源文件里。如果需要在 REPL 里定义类和其伴生对象,需要将它们定义在同一行或者进入 :paste 模式。
泛型类
在定义一个类且并不能确认入参的类型时,就需要一个泛指的类来暂时表示参数类型,而这个类型就是指的泛型。 泛型类使用方括号 []
来接受类型参数。一个惯例是使用字母 A
作为参数标识符,当然也可以使用任何参数名称。
class Car[A] {private var passager: List[A] = Nil
}// 实例后传入参数只能为实例的入参
var car = new Carp[Int]
泛型类型的子类型是 不可传导 的。
Scala模式匹配
Scala 中的匹配模式,对于 Java 中的 switch
语句,根据传参匹配返回对应的结果。 理解以下案例即可:
object ModeMatch {def main(args: Array[String]): Unit = {// 模式匹配案例val x = 2;println(mode(x)); // b}// 定义匹配规制,可以理解策略匹配def mode(t: Int): String = t match {case 1 => "a" // 如果输入参数为 1, 则匹配本条件case 2 => "b"case _ => "c" // 如果以上条件都不匹配,则返回本条}
}
Scala文件I/O
Scala 中的文件读写,通常使用的是 Java 中的 I/O类: java.io.File
读取输入
如果需要读取,用户从键盘上的输入,看参考下列案例:
import scala.io.Sourceobject FileIo {def main(args : Array[String]): Unit = {// 读取文件写入的内容var reader = StdIn.readLine();println("输入的内容为:" + reader)}
}
文件写入
如果需要对文件进行简单的写入,可以参考下列案例:
import java.io._object FileIo {def main(args : Array[String]): Unit = {// 新建一个文件流写入对象val writer = new PrintWriter(new File("scala.txt" ))// 向文件中写入内容writer.write("文件IO")writer.close()}
}
程序执行后,可查看新建的文件:
文件的读取
通过 Scala 的 scala.io.Source
类,能够直接读取文件中的内容,理解下面实例即可:
import scala.io.Sourceobject FileIo {def main(args : Array[String]): Unit = {// 读取文件写入的内容Source.fromFile("scala.txt" ).foreach{print}}
}
异常处理
Scala 中的异常处理和 Java 基本一致,都是为了为了不通过 return
,而直接中断执行程序。 理解下列案例即可:
import java.io.{FileNotFoundException, FileReader, IOException}object OutException {def main(args: Array[String]): Unit = {try {val file = new FileReader("scala.txt")println("file :" + file)} catch { // 如果 try 中语句块执行异常,则会进行捕捉进行以下操作// case 用来匹配异常错误类型case ex: FileNotFoundException => {println("文件未找到异常")}case ex: IOException => {println("IO 异常")}} finally { // finally 不管 try 中的程序是否异常,都会执行println("程序执行结束")}}
}
总结
通过本文总结了 Scala 的面向对象等进阶知识介绍,理解后可以开始开始大数据框架的入门学习,如果对 Scala 非常感兴趣的同学可以前往 Scala 官网学习其 API,最后 Scala 的相关知识分享就到这。
大数据编程语言 Scala 进阶篇相关推荐
- 大数据架构师进阶之路-技术学习路线
大数据架构师进阶之路 自大学毕业从事IT行业已有两年有余,虽在这两年一直没有停止学习的脚步,但总是感觉,不成体系,再就是学过的技术长时间不用,也忘记了,写篇博客的目的,是想在工作之余,一是充实自己,将 ...
- Docker 数据卷之进阶篇
Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...
- map根据value值排序_凯哥带你从零学大数据系列之Java篇---第十九章:集合(Map+Collections)...
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- 阿里巴巴大数据之路——数据模型篇
阿里巴巴大数据之路--数据模型篇 一.概述 1.什么是数据模型? 数据模型就是数据的组织和存储方法.主要关注的是从业务.数据存取和使用角度合理存储数据. 2.典型数据仓库建模方法论 ER模型 纬度模型 ...
- ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- 多层数组如何遍历_带你从零学大数据系列之Java篇---第五章:数组
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- 大数据面试题_Hive篇
文章目录 一.大数据面试题_Hive篇 (一)Hive表与性能优化 1.hive 内部表和外部表的区别 2. hive 有索引吗 3.sort by 和 order by 的区别 4.如何使用过 Hi ...
- 尚硅谷大数据技术Scala教程-笔记04【集合】
视频地址:尚硅谷大数据技术之Scala入门到精通教程(小白快速上手scala)_哔哩哔哩_bilibili 尚硅谷大数据技术Scala教程-笔记01[Scala课程简介.Scala入门.变量和数据类型 ...
- 读《大数据之路-阿里巴巴大数据实践》数据模型篇笔记
读<大数据之路-阿里巴巴大数据实践>数据模型篇 七 建模综述 OLTP 面向数据 随机读写 3NF OLAP 批量读写 不关注一致性更关心数据整合 ER模型–衍生出dataVault 维度 ...
最新文章
- C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)
- ios开发之UIView的frame、bounds跟center属性的区别(附图)
- Linux上使用shell脚本查看内存情况(超实用)
- solr源码分析之solrclound
- 数据中心机房供电需求有哪些?供配电系统如何布置??
- 计算1-100之间 所有能被3 不能被 5整除的数 的 个数,每行打印 5 个
- vue-cli3.0修改浏览器中的小图标
- 《天天数学》连载00:序言
- python技术简介_Python多线程技术简介,简单,阐述,python
- 小数变百分数_小数除法三要“点”
- java main生命周期_java的生命周期
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
- python多维数据聚类可视化_基于python3的可视化数据聚类系统(k-means算法和k-中心点算法)...
- 330UF16V 10*7.7片式铝电解电容封装
- GISAXS和GIWAXS的分析
- 天翼云盘v6.3.5绿色精简版
- 松下伺服务器型号A5和A6,松下伺服电机 A6家族型号对照表.pdf
- 日志审计与分析实验4-1(掌握Linux下安装、删除软件的方法)
- 微信小程序蓝牙连接小票打印机
- 四款软件,提高团队工作效率
热门文章
- jme之Hello Node
- 说话人识别(speaker Recognition/Verification)简介
- 桌面管理landesk太古案例
- 高光时刻 | 方正璞华联合开发的「人力资源法律服务共享平台」在创新创业大赛中获奖
- 小程序: webview与小程序之间的跳转
- dax和m的区别_动态股票K线图----从M语言到DAX表达式
- 【历史上的今天】8 月 1 日:中国的第一台计算机成功运行;Microsoft Office 首次推出;今日头条上线
- Unity背包系统-2:数据库存储方法ScriptableObject和显示背包物品InventoryManager
- 青龙羊毛——酷狗放羊娃(搬运)
- c语言中的less函数,less的小白入门介绍