scala
Scala(Scalable Language)以一种简洁、高级的语言将面向对象和函数式编程结合在一起.Scala的静态类型有助于避免复杂应用程序中的bug,它的JVM和JavaScript运行时允许您构建高性能的系统,可以轻松地访问庞大的库生态系统。
1、scala的特点:
(1)、面向对象
scala是一个纯面向对象的语言,所有的值都是对象、类和对象行为用类和特质来描述
(2)、函数式编程(项目的组成是函数)
纯函数(没有副作用)、一个参数输入,输出是确定的(中间没有涉及到其他变量、数据结构的修改,没有打印),函数要求比较高,所有函数都是值
函数等于一个值,可以作为一个普通的变量去使用
(面向过程)
(3)、静态类型
-类型在编译阶段确定–静态语言 类型在运行阶段确定–动态语言
-强类型语言:(类型转换时确定)必须强制类型转换 弱类型语言:自动类型转换
基于jvm,高性能,先编译为java的class文件,再去运行
2、为什么学scala?
1、速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多
2、简洁优雅:api优雅,spark源码是scala写的
3、能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
3、环境准备
jdk1.8 、开发工具idea、安装scala
注意:路径不要有中文、空格
安装idea
安装idea 插件
解压scala
配置环境变量(SCALA_HOME、PATH)
Scala语法:
1.变量定义###
var 变量名:变量类型=初始化值 (能修改)
val 变量名:变量类型=初始化值 (不能修改)
//变量名在前,变量类型在后
scala> val str:String = "hello"
str: String = hello
scala> val t1 = 3
t1: Int = 3
scala> t1 = 5
<console>:8: error: reassignment to val
t1 = 5
^
scala> var t2 = 3
t2: Int = 3
scala> t2 = 5
t2: Int = 5
scala中:
var修饰的变量,内容和引用都可变
val修饰的变量是不可变的,注意不可变的不是内容,而是引用
举例:
scala> val arr = Array(1,2,3,4)
arr: Array[Int] = Array(1, 2, 3, 4)
scala> arr(1)
res2: Int = 2
scala> println(arr)
[I@7b22ec89
scala> arr
res4: Array[Int] = Array(1, 2, 3, 4)
scala> val arr1 = Array(5,43,65)
arr1: Array[Int] = Array(5, 43, 65)
scala> arr=arr1
<console>:9: error: reassignment to val
arr=arr1
^
scala> arr(1)=55
scala> arr
res6: Array[Int] = Array(1, 55, 3, 4)
val修饰的变量,相当于Java中final修饰的变量
可以加lazy修饰变量(只有val修饰的变量才能被lazy修饰),先不赋值,使用时再赋值
scala> lazy val t = 56
t: Int = <lazy>
scala> t
res7: Int = 56
注意:
1)可以不写类型,根据赋值去判断
2)val修饰的变量不能修改,但val修饰的变量是引用类型时可以修改(举例数组)
3)可以加lazy修饰变量(只有val修饰的变量才能被lazy修饰),先不赋值,使用时再赋值(lazy val j = 100)
2.数据类型
(数值类型 引用类型)
Scala和Java一样,有8种数值类型Byte、Char、Short、Int、Long、Float、Double和一个Boolean类型,和Java不同的是 ,Scala没有基本类型与包装类型之分,这些类型都是类,有自己的属性和方法。
Unit是值类型,他只有一个实例对象()。
Nothing是所有类型的子类,他没有一个具体的实例对象,一个常见的应用如:抛出异常、程序exit,无限循环等。
Nothing是所有类型的子类,也是Null的子类。Nothing没有对象,但是可以用来定义类型。例如,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回) 。
Null是所有引用类型的子类,它只有一个实例对象null,主要用来和其他的JVM语言进行互操作。
详解:
数据类型 描述
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 标准的单精度浮点数
Double 64 位 IEEE 754 标准的双精度浮点数
Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String 字符序列
Boolean true或false
Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null null 或空引用
Nothing Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
Any Any是所有其他类的超类
AnyRef AnyRef类是Scala里所有引用类(reference class)的基类
上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。
3.Scala类型转换
如:char.toInt(调用方法)
scala> val ch:Char = 'A'
ch: Char = A
scala> ch.toInt
res11: Int = 65
4.Scala操作符
Scala中没有操作符,只是以操作符的格式去进行方法调用。没有++ --,所有操作符都是方法 。
//算术运算符
+、-、* 、/、%
//关系操作符
> < >= <= != ==
//逻辑操作符
&& || !
//位操作符
| & ^ ~ << >> >>>
~:补运算符,是一元的,具有‘翻转’位的效应。
>>:带符号右移。正数右移高位补0,负数右移高位补1。
>>>:无符号右移。无论是正数还是负数,高位通通补0。
//赋值运算符
= += -= *= /= %= <<= >>= &= ^= |=
运算符优先级:不清楚时使用(ÿ