Scala语言概述
计算机的缘起
·冯·诺依曼(John Von Neumann)将图灵的理论物化成为实际的物理实体,成为了计算机体系结构的奠基者
·1945年6月,冯·诺依曼提出了在数字计算机内部的存储器中存放程序的概念,这是所有现代计算机的范式,被称为“冯·诺依曼结构”
编程范式
·一个很自然的问题是,既然已经有了命令式编程,为什么还需要函数式编程呢?
·为什么在C++、Java等命令式编程流行了很多年以后,近些年函数式编程会迅速升温呢?
·命令式编程涉及多线程之间的状态共享,需要锁机制实现并发控制
·函数式编程不会在多个线程之间共享状态,不需要用锁机制,可以更好并行处理,充分利用多核CPU并行处理能力
Scala简介
Scala是一门类Java的多范式语言,它整合了面向对象编程和函数式编程的最佳特性。
Scala运行于Java虚拟机(JVM)之上,并且兼容现有的Java程序
Scala是一门纯粹的面向对象的语言
Scala也是一门函数式语言
Scala安装
(1) Linux系统的安装
Scala运行在Java虚拟机(JVM)之上,因此只要安装有相应的Java虚拟机,所有的操作系统都可以运行Scala程序,包括Window、Linux、Unix、MacoS等。
(2)在Linux系统中安装Java
检验一下是否设置正确
如果设置正确的话,$JAVA_HOME/bin/java -version会输出java的版本信息,且和 java -version的输出结果一样
(3)安装Scala
本教程使用的Spark版本是2.1.0,其对应的Scala版本是2.11.8
登录Scala官网,下载scala-2.11.8.tgz
Hello World测试
(1)通过HelloWorld程序了解Scala解释器的使用方法
在Shell命令提示符界面中输入“scala"命令后,会进入scala命令行提示符状态:
(2)在Scala解释器中运行脚本文件
用“:load”命令导入脚本,一次运行多行程序:
使用文本编辑器(比如vim)创建一个代码文件Test.scala
(3) 通过编译打包的方式运行Scala程序
Scala基础知识
基本数据类型和变量
基本数据类型
Scala的数据类型包括:Byte、Char、, Short、Int、Long、Float、Double和Boolean(注意首字母大写)
和Java不同的是,在Scala中,这些类型都是“类”,并且都是包scala的成员,比如,Int的全名是scala.Int。对于字符串,Scala用java.lang.String类来表示字符串
字面量
操作符
操作符优先级:算术运算符>关系运算符>逻辑运算符>赋值运算符
在Scala中,操作符就是方法例如,5+3和(5).+(3)是等价的
富包装类
变量
Scala有两种类型的变量:
val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值
var:是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值
基本语法:
val变量名:数据类型=初始值
var 变量名:数据类型=初始值
类型推断机制(type inference):
根据初始值自动推断变量的类型,使得定义变量时可以省略具体的数据类型及其前面的冒号
var变量初始化以后,可以再次赋值
注意:在REPL环境下,可以重复使用同一个变量名来定义变量,而且变量前的修饰符和其类型都可以不一致,REPL会以最新的一个定义为准
输入和输出
控制台输入输出语句
从控制台读入数据方法: readInt、readDouble、readByte、readShort、readFloat、readLong、readChar、readBoolean及readLine,分别对应9种基本数据类型,其中前8种方法没有参数,readLine可以不提供参数,也可以带一个字符串参数的提示
所有这些函数都属于对象scala.io.StdIn的方法,使用前必须导入,或者直接用全称进行调用
从控制台读入数据方法
向控制台输出信息方法:
print()和println(),可以直接输出字符串或者其它数据类型,其中println在末尾自动换行。
C语言风格格式化字符串的printf()函数
print()、println()和printf()都在对象Predef中定义,该对象默认情况下被所有Scala程序引用,因此可以直接使用Predef对象提供的方法,而无需使用scala.Predef.的形式。
s字符串和f字符串:
Scala提供的字符串插值机制,以方便在字符串字面量中直接嵌入变量的值。
基本语法:s " ...$变量名...”或f "...$变量名%格式化字符..."
读写文件
Scala需要使用java.io.PrintWriter实现把数据写入到文件,PrintWriter类提供了print和println两个写方法
可以使用scala.io.Source的getLines方法实现对文件中所有行的读取