首页 > 技术文章 > 大数据笔记(二十三)——Scala语言基础

lingluo2017 2018-03-29 21:38 原文

一.Scala简介:一种多范式的编程语言

(*)面向对象
(*)函数式编程:Scala的最大特点
(*)基于JVM

二.Scala的运行环境

(1)命令行:REPL
进入: scala
退出::quit
(*) paste 模式: 相当于vi编辑器
进入: :paste
退出: ctrl+D

(2)IDEA
(*) 默认:没有Scala的环境
(*) 需要安装插件:SBT(需要联网,有点慢)

(3)Scala IDE:基于Eclipse

3、数据的类型:基本数据类型
注意:(*)在Scala中,任何数据都是对象
举例:1 是一个对象,就有方法(函数)
scala> 1.toString
res0: String = 1 ====> 定义一个新的变量 res0;类型:String

(*)在定义变量的时候,可以不指定类型
Scala会进行类型的推导
以下两句话等价

val a:Int = 10
val b = 10


(1)数值类型: Byte、Short、Int、Long、 Float、 Double
Byte:8位的有符号数字 -128 ~ 127
Short: 16的有符号数字 -32768 ~ 32767
Int 32位
Long 64位

(2)字符串:字符和字符串 Char String
(*)在Scala中,对字符串有一个特殊操作:插值操作 ---> 前面有一个s

val s1="Hello World"


在下面的字符串中引用上面的s1

s"My name is ${s1}"

(3)Unit类型: 相当于Java中void
举例:val f = () 相当于我们定义了一个函数,并且把该函数的值付给一个变量f来保存

(4)Nothing类型: 一般来说,表示在执行的过程中产生了Exception
举例:定义函数 def
def myfunction = throw new Exception("Some Error....")

4、变量和常量
(*)val和var定义
(*)val 常量
        var 变量

5、函数(重要):头等公民
(1)内置函数
举例:求最大值 max函数

max(10,20)

(2)自定义函数: 关键字def
举例: 求和

def sum(x:Int,y:Int):Int = x + y

也等价于下面的语句

def sum(x:Int,y:Int):Int = {
x+y    
}

注意:返回值不写return关键字,因为Scala中,函数的最后一句话就是函数的返回值

复杂一点的例子:求数的阶乘(递归)
//定义函数求数的阶乘

def myFactor(x:Int):Int = {
if(x <= 1)
1
else
x * myFactor(x-1)
}

//调用

myFactor(5)

6、条件判断: 在Scala中,if...else 是一个表达式,就有表达式的值
循环: for、while、do..while
还可以使用foreach进行迭代
7、函数的参数: 函数参数值的求值策略(call by value、 call by name)

(1)函数参数值的求值策略、
call by value:对函数的实参求值,仅求一次
举例:使用 :

def test1(x:Int,y:Int):Int = x + x

调用: 

test1(3+4,8)

call by name:函数的实参每次在函数体内部被调用到的时候 都会求值
举例:使用 : =>

def test2(x: => Int,y: => Int):Int = x + x

调用: 

test2(3+4,8)


注意:执行的过程是不一样的

 


稍微复杂一点的例子:
x是call by value,y是call by name

def bar(x:Int,y: => Int):Int = 1

定义一个死循环

def loop():Int = loop

调用:

bar(1,loop) //输出1
bar(loop,1) //死循环

(2)函数的参数
(*)默认参数

def func1(name:String="Tom"):String = "Hello " + name

调用

func1()

(*)代名参数:参数多的时候区分是哪一个

def func2(str:String="Good Morning ", name:String="Tom",age:Int=20):String
=
str + name + " and the age of " + name + " is " + age

调用

func2()
func2(age=25)

(*)可变参数: 求多个数字的和:*表示可变

def sum(args:Int*) = {
| var result = 0
| for(arg <- args) result += arg
| result
| }

scala> 

sum(1,2,3)

8、懒值(lazy值)

如果一个变量是lazy,他的初始化会被推迟,直到第一次使用他的时候
举例:

scala> val x:Int =10
x: Int = 10

scala> val y:Int = x + 10
y: Int = 20

scala> lazy val z:Int = x + 10
z: Int = <lazy>

scala> z
res7: Int = 20

9、异常:类似Java
10、数组、映射、元组

(*)数组二维数组:通过数组的数组来实现
(*)映射:就是一个<key,value>的Map集合
(*)元组: Tuple
(*)是不同类型的值的集合

val a1 = (1,2,3,"Hello") ===> 类型:Tuple4[Int, Int, Int, String]

val a2 = new Tuple4(1,2,3,"Hello") :4个元素。个数必须匹配

使用 _下划线来引用元组中的元素

a2._1
a2._2
a2._3
a2._4

遍历元组: 首先需要得到元组的迭代器

a2.productIterator.foreach(println)

 

推荐阅读