第一章:Scala概述

一.Scala背景

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

大数据三个问题

1.数据采集

2.数据存储(HBase)

3.数据计算(Spark,Flink,Mapreduce……)。计算分两种

  1.离线计算:MapReduce;

  2.实时计算:Spark(内存级大数据计算框架)

Scala是多范式编程语言,多种编程方式

  1.面向对象

  2.函数式

Scalable Language

Spark的兴起带动了Scala

发明者Martin Odersky主写Java 1.5与Java8编译器,从Pizza和Scala里引入大量特性到Java

Scala程序目的是高效、简单,少些代码。递归是达到这个目的的重要手段

Scala有以下特性

1.可以使用Java部分语法

2.Scala特有语法

3.增加函数式编程

  1.偏函数

  2.函数柯里化

  3.高阶函数

  4.纯函数

  5.函数作为参数

  ……

4.Scala类可以是对Java形式上的一种包装(继承,实现接口等)

Scala天生语法层面支持并行计算,可以较好的用于大数据计算开发

 

二.Scala特点

1.多范式静态编程语言

2.运行在JVM上

3.简洁高效,删除了三目、++、--运算符

快速学习办法:

1.学习Scala特有语法

2.搞清楚与Java区别

3.如何规范使用Scala

 

三.搭建环境

Windows:1.安装JDK 2.安装Scala程序安装包 3.配置环境变量SCALA_HOME为scala安装路径,并把bin目录加到Path里

Linux:也类似,解压tar包,设置PATH环境变量

Idea Scala插件安装:搜索Scala插件安装

 

四.Scala快速入门

object HelloScala{
      def main(args: Array[String]) :Unit={
             println("hello scala)  
      }
}

object表明一个伴生对象,ojbect 对象名,生成一个“HelloScala$”的伴生匿名类,这个类的静态对象名字叫做MODULE$

先从HelloScala类的main方法执行,会调用HelloScala$.MOUDLE$里的同名方法接着执行

这里可以看到Scala对Java类的包装

Scala认为静态的不是面向对象,所以class里没有,静态的放object里

关键字def定义一个方法

Scala将参数名放前边,类型放后边,用:分隔

Array[String]表示类型为String数组

Unit为空

函数签名与返回结果用:隔开

一般scala可以执行javac编译出来的class文件,java不能执行scalac编译出来的class文件,可能会少类引用

scala可以直接编译、运行scala文件一步走

 

五.Idea创建Scala项目

1.创建一个原生maven项目

2.main目录下创建一个scala文件夹,标记为Source Root

3.默认不能写Scala程序,点击项目名,点击“Add Framework Support”,选Scala

4.创先新Scala文件。有三种类型,Class,Object,Trait

 

 五.Java模拟Scala快速入门程序

 总而言之,就是使用一个内部类,里边有个静态对象,这个静态对象的代码与scala里写的一样,主类同名的方法调用这个单例对象的同名方法

 ojbect等同于声名一个单例的内部类静态对象

 scala给java做了一个包装

 

六.Scala程序总结 

1.源码后缀为scala

2.执行入口为main函数

3.Scala区分大小写

4.Scala程序不需要加分号

5.同一行多个语句,要用分号隔开

 

七.Scala转义字符与Java一样

 

八.字符串输出三种方式

1.用+相连

2.printf

3.s""这种形式,直接在s引导的双引号里用$引用变量。{}包起来表明是个表达式,里边可以直接计算

 

九.关联Scala源码

Ctrl+b查看源代码

Ctrl+Alt+l格式化代码

源码包要引入,maven可以直接下载

 

十.注释

三种注释格式

1.单行注释

2.多行注释

3.文档注释

每个函数都要有个注释

scaladoc -d 【输出目录】 【源码目录】

 tab键右移动,shift+tab键左移动

一行不超过80个字符

 

十一.多看Scala官方编程指南手册 

 

 

 

第二章:变量

 一.基本使用

变量是程序的基本组成单位

声明变量:var 变量名:类型 = 初始值。声明变量时必须初始化变量

赋值变量:变量名=数值

Scala中,常量小数默认为Double,整数默认为Int类型,Float/Long常量要用f/F/l/L修饰

变量指向的对象放在栈还是堆里:基本类型放栈里,对象放堆里。逃逸分析会进一步分析,被多个变量引用生命周期很长的对象被放在堆里

 

二.注意事项

声明变量语法

(var | val )变量名[:变量类型] = 变量值

1.变量类型不写,类型自行推导

不写类型,确认类型有两个办法

  1.使用变量时idea提示

  2.变量调用isInstanceOf[Int]判断

2.类型确认后,不能修改,强类型语言。只能改值,但是不能给另一个类型的值

3.val代表final,声明的是常量

val使用效率高,这种变量没有线程安全问题,是只读的,不会被修改,底层好实现不需要同步保护

val是指可以改变对象里的内容,但是不改变指向的对象

4.加号:两边是数字相加,两边是字符串连接字符串

 

三.数据类型一览图

 Scala中所有数据类型对应的都是对象,没有原生基本类型

Scala数据类型分量两大类

1.AynVal,值类型

2.AnyRef,引用类型

这种类型体系让Scala把面向对象与面向过程完美结合在一起

各种数据类型类带有各种to方法,比如toString转化为字符串

Scala中,一个方法如果没有型参,调用的时候可以不用带小括号

类型体系如下图

 尚硅谷大数据技术之Scala(韩顺平) 随笔

1.根类Any是所有类的父类

2.Scala里一切皆对象。分为两大类,AnyVal和AnyRef

3.Null类是Scala特别类型,只有一个对象值,null。它是所有AnyRef类的子类

4.Nothing是所有类的子类;可以将Nothing类型修饰任意变量或者函数,即任意类型都可以被转换为Nothing没有任何限制。

在抛异常的时候定义返回值类型比较多;Nothing是没有对象的,具有特权可以强制定义异常类型为Nothing,这样被外边的父类型接收的时候就可以自动转换当作父类型,是可以兼容很多地方的。所以哪怕函数返回的是正常类型,Exception也可以转换为Nothing类型

比如if语句是表达式,有返回值,必然有返回值类型,如果x < 0,抛出异常,返回值的类型为Nothing,Nothing也是Int的子类,所以,if表达式的返回类型为Int,get方法的返回值类型也为Int;如果if直接返回Exception类型则Exception无法与Int类型做转换,需要加Nothing做桥梁

5.低精度类型的值可以向高精度类型的值转换,叫做隐式转换 

6.Uint和void相同,具体值只有一个为()

7.计算机二进制里,负零来表达负数最小数

8.Double比Float小数点精度多七位

9.Char有两个字节表示,用单引号包起来

10.当把一个计算后的结果赋给一个变量,编译器会检查结果类型/范围与变量类型/范围是否匹配,匹配自动转换;当把一个常量赋给变量,编译器只会看范围是否匹配,不会看类型是否匹配。所以,可以写 var cha:Char = 98; ,98虽然是个Int,但是没有超过Char的范围;却不可以写 var lon:Long = 5989068236259268946 ,5989068236259268946超过Int范围了,不能pass,要加l/L修饰才行。

这是因为计算会有临时变量,不是常量了

11.boolean只能是true和false

12.10 max 2和10.max(2)等价,只有一个参数

13.更大的数有 BigInt等类

 

四.值类型自动转换

1.有多种数据类型混合计算的时候,自动将所有数据转为容量最大的数据类型

2.对于变量,大的数据类型转给小的数据类型默认会报错

3.Byte和Char不会自动转换

4.Byte,Char,Short在混合计算时会自动转成Int,Int是最低精度

5.自动提升原则:表达式的结果类型自动提升为操作数中最大的类型

6.还有高级隐式转换和隐式函数 

 

五.值类型的强制转换 

 用自带的toInt等函数转换,会有损失精度风险

强制转换只针对最近的操作数有效

Byte和Short参与计算时变成Int类型

 

六.值类型与String类型的转换

基本类型转字符串:+ ""

Idea里操作符带下滑横线表明编译器自动做类型转换

String自带的toInt等方法将String转为基本类型

Double字符串不能转为Int

 

七.标志符的命名规范

凡是可以取名字的地方,变量/方法/函数,都叫标志符

1.首字符是字母,数字,下划线,美元符号

2.数字不可以开头

3.首字符是算数运算符,后边也要跟个算数运算符

4.操作符不能放在中间和尾部

5.反引号包起来的字符串里可以使用关键字 ,底层有改名

底层编译处理:

把操作符转为英文名字并以美元符号开头

Int不是关键字,是预定义标志符

Scala关键字:一共39个

 

 

第三章:运算符

运算符分五类

1.算数运算符

2.赋值运算符

3.比较运算符(关系运算符)

4.逻辑运算符

5.位运算符

 

一.算数运算符

1.a % b等价于a - a / b * b

2.在scala没有++和--,用+= 1代替

3.运算的时候5和5.0一定要设好,看要不要算小数

 

二.关系运算符

1.浮点数比较,类型一定要相等,精度要相同

 

三.逻辑运算符

1.最后的返回值是个Boolean值

 

四.赋值运算符

1.除了=,还有各种组合等号,比如&=

2.代码块也有返回值,{}可以赋给变量

3.不使用中间变量,交互两个数。a = a + b;b = a - b;a = a - b。或者用位运算

 

五.位运算符

>>>是无符号右移(符号位不动)

 

六.特别注意

1.Scala不支持三目运算符,用if else代替

 

七.运算符优先级

只有单目运算和赋值运算方向从右到左,其他从左到右

逗号运算符返回一个用()扩起来的元祖

 

八.输入

StdIn.readLine读取一行

 

第四章.流程控制

一.顺序控制

1.引用变量采用向前引用,先声明定义再使用

2.函数顺序可以随便搞

 

 

 

 

 

 

 

 

 

 

第五章

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄