Scala基本类型

1、其类型首字母都要大写。

scala变量定义,首先需要一个关键字  val  或者 var  接着是变量名  : 冒号后面跟着变量类型 =  等号后面跟着变量值

val  a:Int =1   定义一个变量 a ,是整形 ,初始值是1

如果定义float类型的话,小数点后面要加一个f(因为有小数都认为是double类型)

还有一个对于String类型,用的都是双引号(可以是一个字符也可以是多个字符)

对于chart类型,用的都是单引号。(只能是一个字符)

boolean类型,是ture或者false

在应用中,scala编辑器是自动识别推断其类型,但是对应的单引号或者双引号要正确。

对于整形中的byte,long,short等类型,要指明确告诉它要将它定义成为其中的类型。

 

对于关键字val 与var,

val定义了一个变量值后,变量值是不能再改变了

var定义了一个变量值后,其变量值还可以改变

2、程序控制语句。

a、 if 语法结构
if ("about" == "yun") {   println("about == yun") } else {   print("about != yun") }
// 输出 about != yun

// 使用if 语法定义变量,x结果为0
val x = if ("about" == "yun") 1 else 0

b、 while 语法结构
var x = if ("about" == "yun") 1 else 0
while (x < 5){   x += 1   println("x: %s".format(x)) }

c、

val arrs = Array("aboutyun", "hadoop", "spark")  //一个数组(可用while也可用for循环输出)

// 集合操作方式(常用) for (arr <- arrs){   println("arr: %s".format(arr)) } 但有前缀

// 间接操作方式
for (i <- 0 to arrs.length - 1){   println("arr: %s".format(arrs(i))) }//用的是to

for(i<-0 until arrs.length){println(arrs(i))}//用的是until

d、for循环

// 生成一个0到5的集合
val arrs = 0 to 5

// 针对arrs中的偶数乘以2生成一个新的集合 for (arr <- arrs if arr % 2 == 0) yield arr * 2

// for循环嵌套
for (i <- "abc"; j <- "xyz") println(s"$i+$j")

for (i <- "abc"; j <- "xyz") {println("i:%s,j:%s".format(i,j))}//其实%s,输出字符串时,将i,j替换前面的%

3、Array/List的基本操作

a、// 定义一个长度为5的整型数组
scala> val arrs = new Array[Int](5)  //这里用new
arrs: Array[Int] = Array(0, 0, 0, 0, 0)

// 赋值给第一个索引
scala> arrs(0) = 100

scala> arrs// 直接输入数组名就能输出其内容
res22: Array[Int] = Array(100, 0, 0, 0, 0)

// 使用apply方法定义数组及赋值
scala> val arrs = Array[Int](100, 200, 300)  //这里不用new,而是让它自动调用apply
arrs: Array[Int] = Array(100, 200, 300)

b、array的遍历

scala> val arrs = Array[Int](100, 200, 300)
arrs: Array[Int] = Array(100, 200, 300)

方式一:scala> for (arr <- arrs) println(arr)  //表示对其遍历打印出来

方式二:scala>for(i<-0 until arrs.length){println(i)}//打印i是其索引。如果打印的是arrs(i)则是其里面的每个元素

c、List的定义和操作

// 构造List对象
scala> val list = List(1, 2, 3)  //内部用的是apply的方式。直接定义名字
list: List[Int] = List(1, 2, 3)
// 使用Nil和 :: 追加符来构建
scala> val list = 1 :: 2 :: 3 :: Nil   //方式二:nil 是一个空的list,可以直接输出空集合,  先创建一个空集合,::就是不断添加元素
list: List[Int] = List(1, 2, 3)

// 添加元素
scala> list :+ 4   //方式三:集合后面添加一个冒号: 添加一个加号+  然后就是要添加的元素了。也可以往前加
res60: List[Int] = List(1, 2, 3, 4)
scala> list
res61: List[Int] = List(1, 2, 3)

// mkString使用“_”拼接元素(制作字符串
scala> list.mkString("_")  //表示拼接时候用什么拼接
res62: String = 1_2_3

其他常用方法:head, last, take   //list.head 是取第一个    list.last是最后一个元素  list.take是取多少个元素,并且生成新的list

d、List的遍历

// 方式一
scala> for (l <- list) print(l + ",")    //直接打印每个元素,对于可循环的都能用
1,2,3,

// 方式二
scala> list.foreach(l => print(l + ","))//不需要再输入集合的名字了。l就表示list里面的每一个元素。
1,2,3,

在scala终端,输入一个list在输入一个点 . 回车后,会出list所有能调用的方法。

这两种方式的区别:

4、Set/Map/Tuple 操作

set有一个功能可以去重,元素不重复。map是映射,里面的元素是有两部分。Tuple里面的元素可以是不同类型的

a、Set的操作

Scala 默认导入一下的包:

import java.lang._ import scala._ import Predef._

Predef中默认包含了 不可变的Set/Map,如果要使用可变的集合需要手动导入scala.collection.mutable包

Set是一种不存在重复元素的集合,与数学中定义的集合是对应的。且是无顺序的

// 定义Set
scala> val set = Set(1, 2, 1, 3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)  自动去重

// 增加元素
scala> set + 5
res98: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)

b、Map操作

Map 是一种键值对的集合,一般翻译成映射

// 定义不可变 Map 键与值之间用->进行分隔
scala> val map = Map("aboutyun" -> "a", "hadoop" -> "h", "spark" -> "s")
map: scala.collection.immutable.Map[String,String] = Map(aboutyun -> a, hadoop -> h, spark -> s)

// 定义可变 Map(在前面导入一个包名时候是可变的
scala> val map2 = scala.collection.mutable.Map("aboutyun" -> "a", "hadoop" -> "h", "spark" -> "s")
map2: scala.collection.mutable.Map[String,String] = Map(spark -> s, hadoop -> h, aboutyun -> a)

// 添加元素,用put的方法
scala> map2.put("flume","f")
res128: Option[String] = None

scala> map2
res129: scala.collection.mutable.Map[String,String] = Map(spark -> s, hadoop -> h, aboutyun -> a, flume -> f)

可变的,是复制初始化后,还可以对其内容进行修改,增加。而不可变的一旦初始化后就不能变了。

c、Tuple 操作

Tuple 是一种可以包含多个类型元素的集合,一般翻译成元组

// 定义元组
scala> val tuple = ("aboutyun", "hadoop", 1)  //tuple定义的时候要用括号
tuple: (String, String, Int) = (aboutyun,hadoop,1)    //回车后就会输出显示其类型
// 二元组特殊定义方式 (其实和map的键值对是差不多的
scala> val tup = "aboutyun" -> 1
tup: (String, Int) = (aboutyun,1)

// 访问第一个元素
scala> tuple._1(返回第一个元素与前面的取索引是不一样的。
res141: String = aboutyun

// 模式匹配获取元素内容
scala> val (a, b) = tup
a: String = aboutyun
b: Int = 1

d、遍历方式

5、函数和常用高阶函数

a、函授的格式

Scala基本类型          

 def是一定要使用的,  函数体也是函数的功能。

b、函授字面量

函数字面量表示函数可以赋值给变量
Scala函数将最后的值作为函数的返回值,不需要return语句

// 定义一个自增函数
scala> def increase(x:Int): Int = {x+1}
increase: (x: Int)Int

scala> increase(1)
res145: Int = 2

Scala基本类型

// 使用incr引用increase函数,=>左侧表示输入,右侧表示转换操作
scala> val incr = (x: Int) => x + 1  (=>的的左边表示要接收的参数类型,右边是一个方法体
incr: Int => Int = <function1>       (函授赋值给变量也)

scala> incr(1)
res151: Int = 2

c、匿名函授

集合的map函数可以对集合中的每个元素进行操作,接受的参数为针对元素进行操作的函数,例如相对List(1, 2, 3)集合中每个元素加1,可以使用以下方法:

scala> println(List(1, 2, 3).map(incr))     (如果函授的参数又是另一个函授的话,则称之为高阶函数
List(2, 3, 4)

// 使用匿名函数进行简化
scala> println(List(1, 2, 3).map((x:Int) => x + 1))  (这里不用写匿名函授了,而是直接写函授字面量
List(2, 3, 4)

Scala基本类型

d、函授简化

// 简化匿名函数,自动判断类型
scala> println(List(1, 2, 3).map((x)=> x + 1))
List(2, 3, 4)

// 简化匿名函数,函数参数只有一个,可以省略 ()
scala> println(List(1, 2, 3).map(x=> x + 1))
List(2, 3, 4)

// 简化匿名函数,函数参数右侧只出现一次,可以进一步简化
scala> println(List(1, 2, 3).map(_ + 1))
List(2, 3, 4)

// 可以使用花括号{} 替代小括号 ()

scala> println(List(1, 2, 3).map{_ + 1})
List(2, 3, 4)

e、常用的高阶函数

map

map函数用于对集合中的每个元素进行转换

// 对列表中所有元素加1
scala> println(List(1, 2, 3).map(_ + 1))
List(2, 3, 4)

// 获取所有key
scala> println(Map("spark"->1,"hive"->2,"hadoop"->3).map(_._1))
List(spark, hive, hadoop)

// 等价于
scala> println(Map("spark"->1,"hive"->2,"hadoop"->3).map(x => x._1))
List(spark, hive, hadoop)

// 等价于
scala> println(Map("spark"->1,"hive"->2,"hadoop"->3).map{case (k, v) => k})
List(spark, hive, hadoop)

flatten

flatten 函数用于对嵌套的集合展开,函数接收的参数类型为集合类型

scala> println(List(List(1, 2, 3), List(5, 6)).flatten(x=>x.reverse))
List(3, 2, 1, 6, 5)

scala> println(List(List(1, 2, 3), List(5, 6)).flatten)
List(1, 2, 3, 5, 6)

flatMap

flatMap函数结合了flatten和map两个函数的功能

scala> println(List(List(1, 2, 3), List(5, 6)).flatMap(x => x.map(x => x + 1)))
List(2, 3, 4, 6, 7)

scala> println(List(List(1, 2, 3), List(5, 6)).flatMap(_.map(_ + 1)))
List(2, 3, 4, 6, 7)

filter

filter函数用于筛选集合中满足某些条件的元素

scala> println(List("List","Set","Array").filter(_.length>3))
List[String] = List(List, Array)

scala> println(Map("List"->3,"Set"->5,"Array"->7).filter(_._2>3))
Map(Set -> 5, Array -> 7)

reduce

reduce函数用于对集合做聚合,接受两个参数,常用于把当前结果和集合的下一个元素累加

scala> println(List(1, 2, 3, 4).reduce((x, y) => x + y))
10

// 简化
scala> println(List(1, 2, 3, 4).reduce(_ + _))
10