如何快速学习Scala

大数据学习过程中,会学习非常多的技术,但SCALA无疑是必不可少,那我们在大数据技术的学习过程中,如何快速的认识scala,并且学习它,感谢科多大数据公司的余老师提供的详细素材,本人整理成章,希望对你们有帮助。

众所周知,Spark支持4门语言,分别为R、Python、Java与Scala,但真正的底层实现语言则是Scala。在我以往的实践分享中,除了Python,我还会利用Scala去实践一遍,而且在面对大规模的数据建模中,我都会推荐去使用Hadoop、Spark去工程开发,充分利用集群的计算资源。本文让大家快速了解Scala,并且学会如何学习和使用Scala。

一、哪些人群适合学习Scala?

你必须要有清晰的职业发展规划,而不是追逐着潮流去乱学一通,要学以致用,而不是学非所用!

因此,如果你定位是成为一名大数据开发工程师、数据应用架构师 的话,你需要去了解,更要往底层深入的学习!

如果你定位是成为一名ETL工程师、数据挖掘工程师 的话,你需要去了解,更要往实践应用去学习!

除此之外,我并不建议你花心思去折腾它,毕竟你工作场景中也使用不到。

二、哪个阶段适合学习Scala?

我并不支持一上来就直接去学习它,因为不积跬步无以至千里,我更希望你有一定Python或者java的基础,再了解一些Hadoop/Spark的应用,才能更好,更快去上手,而不是陷入一种困惑:”我学它到底有什么用?”。

对于学习顺序,建议java-hadoop-hive-hbase-flume-kafka-storm-scala-spark

三、使用Scala有什么优势?

学习它并不是让你在面试时候能够装一装,因为如果只懂皮毛,反而是弄巧成拙,那就不好了。

学习它的初衷,是因为实际工作场景中有需要,平台集群环境所决定,用合适的工具做正确的事,仅此而已。

就我目前的体验来看,它肯定比Python、R这类语言更适合大规模数据的工程开发,更符合线上挖掘业务的生产使用。它也比MapReduce、Java这类语言更简洁,更高效去开发,而且能提高计算效率。

当然,技术不局限于只固定使用一种语言,而是从业务和环境角度,灵活选择合适的语言去开发,让技术服务于业务。

四、如何能学习上Scala?

可以选择购买一些相关书籍,或者在线上寻找学习资源,这类资源都非常多,但无经验的小伙伴,尤其是0基础,还是建议系统学习,可以自学也可以选择靠谱的培训机构

五、哪些知识需要掌握?

除了参考网络的学习资料外,这里分享一些必要的基础知识介绍,便于你聚焦学习方向。

① 语言的背景(了解)

scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。

scala是纯粹的面向对象的语言。java虽然是面向对象的语言,但是它不是纯粹的,因为java的基本数据类型不是类,并且在java中还有静态成员变量和静态方法。相反,scala是纯粹面向对象的,每个值都是对象,每个操作都是方法调用。

scala也是一个成熟的函数式语言。函数式编程有两个指导思想:

a. 函数是头等值,也就是说函数也是值,并且和其他类型(如整数、字符串等)处于同一地位,函数可以被当作参数传递,也可以被当作返回值返回,还可以在函数中定义函数等等;

b. 程序的操作应该把输入值映射为输出值而不是就地修改,也就是说函数调用不应产生副作用,虽然函数式编程语言鼓励使用“无副作用”的方法,但是scala并不强制你必须这么做。

scala允许你使用指令式的编程风格,但是随着你对scala的深入了解,你可能会更倾向于一种更为函数式的编程风格。向函数式编程转变,你就应该尽量去使用val、不可变对象、无副作用方法,而不是var、可变对象、有副作用方法。要明白的是,从指令式编程向函数式编程的转变会很困难,因此你要做好充分的准备,并不断的努力。

scala运行于JVM之上,并且它可以访问任何的java类库并且与java框架进行互操作,scala也大量重用了java类型和类库。

② 使用IDE实现Hello Scala(实践)

除了Scala解释器外,我更常用IDE去开发,比如利用已部署好的环境,开发一个Demo程序。

object Demo {

def main(args: Array[String]) {
println("Hello Scala.")
}
}

其中,有几个写法的注意事项,需要你去了解的,具体如下所示:

01. 在scala中,语句之后的“;”是可选的。当有多个语句在同一行时,必须加上分号,但不建议把多个语句放在一行。

02. 建议使用2个空格作为代码缩进,常规的朋友会倾向于一个Tab键。

03. Scala的索引也是从0开始的,但是元祖从1开始。

04. 不管是Import方法,还是匹配,使用 _ 相当于Java中的 * 作用。

③ Scala的数据类型(常用)

它有7种数值类型:Byte、Char、Short、Int、Long、Float和Double,以及2种非数值类型:Boolean和Unit(只有一个值“()”,相当于java和c++中的void,即空值)。

这些类型都是抽象的final类(不能使用new新建,也不能被继承),在scala包中定义,是对java基本数据类型的包装,因此与java基本数据类型有相同的长度。

另外,scala沿用了java.lang包中的String。在scala中,常量也称作字面量,字符串字面量由双引号包含的字符组成,同时scala提供了另一种定义字符串常量的语法——原始字符串,它以三个双引号作为开始和结束,字符串内部可以包含无论何种任意字符。

在scala中,我们使用方法,而不是强制类型转换,来做数值类型之间的转换,如99.44.toInt、97.toChar。

④ Scala的变量类型(常用)

它有两种变量:val和var。val如同java中的final变量,var如同java中的非final变量。

由于scala是完全面向对象的,因此val和var只是声明了对象的引用是不可变的还是可变的,并不能说明引用指向的对象的可变性。

声明变量的同时需要初始化之,否则该变量就是抽象的。如果不指定变量的类型,编译器会从初始化它的表达式中推断出其类型。

当然你也可以在必要的时候指定其类型,但注意,在scala中变量或函数的类型总是写在变量或函数的名称的后边。

val str : String = “Hello Scala.”

⑤ Scala的控制结构(常用)

它与其他编程语言有一个根本性差异,也就是几乎所有构造出来的语法结构都有值,从而使得程序结构更加精简。

它内建的控制结构很少,仅有if、while、for、try、match和函数调用等而已,所以熟悉这几类就足够了。如此之少的理由是,scala从语法层面上支持函数字面量。

另外,scala中没有break和continue语句,如果有需要类似功能,可以间接性去实现,如使用Boolean的控制变量、嵌套函数等。

⑥ Scala的函数定义(常用)

定义函数时,除了递归函数之外,可以省略返回值类型声明,它会根据=号后边的表达式的类型推断返回值类型,同时=号后边表达式的值就是函数的返回值,你无需使用return语句。

因为它推荐你使用表达式值代替return返回值,当然根据需要,也可以显式使用return返回值。

def getNowDate():String={

var now:Date = new Date()

var dateFormat:SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")

var todatTime = dateFormat.format(now)

todatTime

}

以上函数的意思是为了获取当前日期,如今天2018-10-19。而对于递归函数必须指定返回值类型,如下斐波拉契数列所示:

def fac(n: Int) : Int = if(n <= 0 ) 1 else n * fac(n-1)

最后,如果没有函数值返回,则默认返回值是Unit。

⑦ Scala的异常处理(常用)

它与java的类似,但也有区别,如它不需要提前声明函数、方法可能会抛出的某种异常。而且throw、try-catch-finally表达式都是有值的,当没抛异常时,try处为表达式的值;当抛异常被捕获时,catch处为表达式的值;当抛异常没被捕获时,就没有返回值;finally处计算得到表达式值,不过它常用于处理 关闭文件、连接 等。

也就是说,如果你想快速入门Scala这么语言,能够去实践开发一些小模型,数据处理逻辑,等等。那上面这7点知识,基本囊括了你短期学习的方向,而更深入的知识点,可以在后期查缺补漏,结合实际场景去调研,去学习,去使用。

更多学习资料,可以给我留言

六、学好Scala的核心关键?

这也是学习任何一门语言,甚至是手艺的通用方法,这里很简化去概括,更多细节需要慢慢去体会。

第一点:必要的基础打扎实;

第二点:多寻找开发场景去实践,目的是为了练手、遇到新问题、锻炼解决问题的能力;

第三点:遇到开发困难,先理清瓶颈在哪里?再多搜索网络资料针对性去解决;

第四点:完整去开发一个全流程的数据项目,甚至是业务场景模型,把零散知识贯穿起来;

道理可能大家都懂,但是方法一定要选择正确,才能事半功倍。

本文转自:https://www.toutiao.com/a6613915647984271886/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1539994648&app=news_article&utm_source=mobile_qq&iid=46395736178&utm_medium=toutiao_android&group_id=6613915647984271886

上一篇:JavaWeb高级:Servlet源码分析


下一篇:Java内存管理-你真的理解Java中的数据类型吗(十)