文章目录
1.为什么要学习Scala?
1、spark底层是用Scala语言编写
2、Scala基于Java ,开发效率高运行速度快
2.Scala的简单介绍
scala 是一门多范式的编程语言。即面向对象也是函数式编程。
面向对象:万物皆对象 、封装、实例对象、类、继承
函数式编程: 面向过程 函数当成编程
3.与Java语言的对比
相同点:
1.java和scala可以无缝混编,它们都是基于jvm
2.二者可以相互调用
不同点:
1.类型自动推断,并如果写类型化,是写在变量名的后面
2.val(定义的为常量不可变的量) var(定义的为变量)
3.支持函数式编程
4.构造器不一样
5.java中可以自动默认值,scala中必须手动给默认值
6.scala 不需要分号,但是java 必须要有
7.get set 方法自己实现
age:相当于java中的getter方法
age_$eq:相当于java中set方法
8.java中的放回只用return scala 中没有return
4.编译工具的安装
1)jdk (这里我使用的是JDK1.8)
2)idea (这是我们的编程软件)
3)插件安装(离线和在线都可以,如果我们的编程软件没有集成Scala的话我们就安装下面这个插件)
- scala-intellij-bin-2017.2.2.zip (一个插件就搞定了)
4)安装SDK
5)创建一个scala项目测试一下
这里要记得是创建Scala项目,不要创成Java项目了
6)字体背景稍微调整一下
此选项呢可以根据个人来设置
5.main方法讲解
语法
main(static=object)
1)语法
语法:关键字 方法名 (参数):返回类型={
}
例子:def main(args: Array[String]): Unit = {
}
6.常量和变量
1)定义
常量:是在运行的过程中,其值不会发生变化的量 例如:数值3 字母A 修饰的关键字val
变量:是在运行的过程中,其值可以发生变化的量 例如:时间,年龄 修饰的关键字var
2)语法
val name:Type=变量值
var name:Type=变量值
注意1:
类型可以不写,scala 可以自动类型推到
注意2:变量名称必须符合命名规范,不能使用关键字(命名规范和java一样)
1.字母,下划线,数字组成,并且不能以数字开头
val 4_tablename="t_user";
2.变量名要做到见名知意,(如果英文不好我们通过通过有道翻译)
3.用驼峰命名法命名多个单词组成的变量名
val tablename="t_user";
4.变量名不能使用关键字
val def =12
7.数据类型
any是所有类型的超类,也成为顶级类型
Any是所有类型的超类型,也称为顶级类型。Any有两个直接子类:AnyVal和AnyRef。
AnyVal代表值类型。有9个预定义的非空的值类型分别是:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是不带任何意义的值类型,它仅有一个实例可以像这样声明:()。所有的函数必须有返回,所以说有时候Unit也是有用的返回类型。
AnyRef代表引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户自定义的类型都是AnyRef的子类型。
Null是所有引用类型的子类型(即AnyRef的任意子类型)。它有一个单例值由关键字null所定义。
Nothing是所有类型的子类型,也称为底部类型。没有一个值是Nothing类型的。
anyVal (值类型) :
int short byte long double string char boolean Uint (9个)
长度 4 2 1 8 8 4 2 1
anyRef(引用类型) :
List map option yourclass ....
注意:java类型中没有和scala中Nothing对应的类型
8.懒加载
1)scala 中使用lazy 关键字修饰变量,就是惰性变量,实现延迟加载
注意:惰性变量只能是常量,并且只有在调用惰性变量时,才会去实例化这个变量
Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。
2)案例演示
//正常的
var str = {
println("helloworld")
}
//懒加载的形式
lazy val str1 = {
println("helloworld")
}
//调用这个变量
str1
3)好处
使用在比较耗时的业务中,如网络IO 磁盘IO
9.差值器
Scala语言中有三种差值器
1.s差值器
在任何字符串前面加上s,就可直接在字符串中使用变量了
val name:String=“cat”
println(s"she is name is ${name}")
2.f插值器:
val height=1.23568
println(f"身高是${height}%.2f")
3.raw插值器:是输入字符串原样,不进行转义
除了对字面值中的字符不做编码外,raw 插值器与 s 插值器在功能上是相同的。
例如:
//没有使用raw
println("a\nb\n\tc")
//使用的效果
println(raw"a\nb\n\tc")
10.访问修饰符
1)private
private :一个类的内部可用
2)protected
protected:自己类 子类也可以被访问(这个比java更加严格,java同一个包的其他类也可以访问)
3)public
public ::如果没有指定修饰符 ,这样的成员在任何地方都可以被访问
注意:
如果不指定的情况下,就是public
实例1:(只能自己访问)
class Test01 {
private val name = "XXX"
def main(args: Array[String]): Unit = {
println(name)
}
}
实例2:
class Test01 {
protected val name = "XXX"
}
class Test02 extends Test01 {
def main(args: Array[String]): Unit = {
println(name)
}
}
实例3:
object Test {
def main(args: Array[String]): Unit = {
val test0 = new Test01
println(test0.name)
}
}
class Test01 {
val name = "XXX"
}
11.运算符
1)算术运算符
算术运算符:加 减 乘 除 取余
object Test {
def main(args: Array[String]) {
val a = 100
val b = 200
val c = 250
val d = 250
println("a 加 b = " + (a + b))
println("a 减 b = " + (a - b))
println("a 乘 b = " + (a * b))
println("b 除 a = " + (b / a))
println("b 取余 a = " + (b % a))
}
}
2)关系运算符
关系运算符: == != > < >= <=
object Test {
def main(args: Array[String]) {
val a = 100
val b = 200
println("a 等于 b 是: " + (a == b))
println("a 不等于 b 是: " + (a != b))
println("a 大于 b 是: " + (a > b))
println("a 小于 b 是: " + (a < b))
println("b 大于等于 a 是: " + (b >= a))
println("b 小于等于 a 是: " + (b <= a))
}
}
3)逻辑运算符
逻辑运算符:&& || !
object Test {
def main(args: Array[String]) {
var a = true;
var b = false;
println(a&&b)
println(a||b)
println(!a)
}
}
4)赋值运算符
赋值运算符: = += -= *= /= %=
var a = 10;
val b = 20;
var c = 0;
c = a + b;
println(c);
var a = 10;
var c = 0;
c += a ;
println( c );
var a = 10;
var c = 0;
c -= a ;
println( c );
var a = 10;
var c = 0;
c *= a ;
println("c *= a = " + c );
val a = 10;
var c = 15;
c /= a ;
println("c /= a = " + c );
val a = 10;
var c = 15;
c %= a ;
println("c %= a = " + c );
12.类型转换
1)String 类型转换为Int
val age:String ="123"
println(age.toInt.getClass.getName)
2)Int 类型转换为String
val b:Int =123
println(b.toString.getClass.getName)
3)String类型转换为Float类型
val c:String ="123.123"
println(c.toFloat.getClass.getName)
13.小试牛刀
问题1:scala 语言如何接受键盘的输入?
println("请输入姓名:")
val int = Console.readLine()
println("您的姓名是:"+int)
问题2:字符串中获取收尾字母
//获取首字符??
"Hello"(0)
"Hello".take(1)
//获取尾字符??
"Hello".reverse(0)
"Hello".takeRight(1)
问题3:随机数字生成?
val int = Random.nextInt(10)
println(int)
由于时间原因今日就先写到这里。
————————————————————————————END————————————————————————————————