scala学习

Scala是什么
Scala是基于JVM的编程语言。Java是运行在jvm上的编程语言,java源代码通过jvm被编译成class文件,然后在os上运行class文件。Scala是运行在jvm上的编程语言,scala源代码通过jvm被编译成class文件,然后在os上运行class文件。

 

声明值和变量
var a = 12        //定义变量

val b = 23        //定义常量,在spark编程中一般都是定义为常量

注:在scala中,对于变量必须要初始化,不允许只声明而不初始化。

 

在scala的变量声明时,可以不指定类型,由解释器自己判断。
“superman ”*3    //表示字符串“ superman”反复输出3次
“superman ”*3    //实际上是字符串“ superman”调用方法*,传入的参数是3

函数在声明后,无论是否有“=”,都有返回值。当没有“=”的时候,表示返回值是Unit类型,Unit类型的值是()。当有“=”的时候,返回值是函数体中的最后一行的值。如果返回值类型强制指定为Unit类型,那么返回值必定是()。

 

if判断

 

def testif(a:Int) :Int = {
    if(a>1){
        1    
    }else if(a<1){
        0
    }else{
        -1
    }            
}

 

 循环

循环(while、for)
基本循环结构,使用生成式“变量 <- 范围”表示

for(i <- 1 to 10){
    printlin(i) // 1 2 3 4 5 6 7 8 9 10
}

 

如果需要倒叙输出,后面加reverse

for(i <- 1 to 10 reverse){
    println(i) // 10 9 8 7 6 5 4 3 2 1
}

 

如果修改步长,可以使用守卫方法,即在生成式后面加一个boolean判断,符合条件的输出

for(i <- 1 to 10 reverse;if i%3==0){
    println(i) // 9 6 3
}

 

 修改步长更简单的方式如下,to后面使用括号,括号中第二个参数表示步长

for(i <- 1 to (10,3)){
    println(i)     // 1 4 7 10
}

 

 支持类似于java的双重for循环,在scala中只需要一个for即可

for(i <- 1 to 10; j <- 1 to 10){
    println(i+"---"+j)
}

 

使用for推导式,可以把结果保存起来

//for推导式,产生新的集合
var a = for(i <- 1 to 10 reverse; if i%3==0)yield(i+1)
println(a)    //Vector(10, 7, 4)

 

常用数据结构
数组
    数组的两种声明方式,建议声明数组时指定类型。

 1、定长数组:长度不变的数组Array,如:声明一个长度为10的整形数组,val arr = Array[Int](10);声明并初始化一个字符串数组: val arrStr = Array(“wo”,”cha”,”yo”)。访问数组方式:访问arrStr第一个元素,arrStr(1)即可

2、变长数组(即数组缓冲):java中有ArrayList和scala中的ArrayBuffer等效;但是ArrayBuffer更加强大,通过下面的事列来熟悉ArrayBuffer:

    import collection.mutable.ArrayBuffer
    val arrbuff1 = ArrayBuffer[Int]()
    val arrBuff2 = ArrayBuffer(1,3,4,-1,-4)
    arrbuff1 += 23    //用+=在尾端添加元素
    arrbuff1 += (2,3,4,32) //同时在尾端添加多个元素
    arrbuff1 ++= arrBuff2 //可以用 ++=操作符追加任何集合
    arrbuff1 ++= Array(2,43,88,66)
    arrbuff1.trimEnd(2) //移除最后的2个元素
    arrbuff1.remove(2)  //移除arr(2+1)个元素
    arrbuff1.remove(2,4) //从第三个元素开始移除4个元素
    val arr = arrbuff1.toArray //将数组缓冲转换为Array
    val arrbuff2 = arr.toBuffer //将Array转换为数组缓冲

  3、遍历数组和数组缓冲:在java中数组和数组列表/向量上语法有些不同。scala则更加统一,通常情况,我们可以用相同的代码处理这两种数据结构,for(…) yield 循环创建一个类型和原集合类型相同的新集合。for循环中还可以带守卫:在for中用if来实现。

 

    for(i <- 0 until arrbuff1.length) yield arrbuff1(i) * 2 //将得到ArrayBuffer(2,6,4,-2,-4)
    for(i <- 0 until (arrbuff1.length,2)) yield arrbuff1(i) * 2 //将得到ArrayBuffer(12,-4)
    for(elem <-0 arrbuff1) print(elem) //如果不需要使用下标,用这种方式最简单了
    for(i <- arrbuff1 if arrbuff1 > 0) print i //打印出arrbuff1中为整数的值
    arrbuff1.filter( _ > 0).map{ 2 * _} //生成arrbuff1中的正数的两倍的新集合
    arrbuff1.filter {_ > 0} map {2 * _} //另一种写法
    

 

  4、常用算法:scala有很多便捷内建函数,如

    arrbuff1.sum //对arrbuff1元素求和
    Array("asd","sdf","ss").max //求最大元素
    arrbuff1.sorted(_ < _)  //将arrbuff1元素从小到大排序
    arrbuff1.sorted(_ > _)  //从大到小排序
    util.Sorting.quickSort(Array) //针对数组排序,单不能对数组缓冲排序
    val arr = Array(1,23,4,2,45)
    arr.mkString(",") //指定分割符
    arr.mkString("(",",",")") //指定前缀、分隔符、后缀

 

Scala Map(映射)

Map(映射)是一种可迭代的键值对(key/value)结构。

所有的值都可以通过键来获取。

Map 中的键都是唯一的。

Map 也叫哈希表(Hash tables)。

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。

默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map

在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。以下实例演示了不可变 Map 的应用:

// Map 键值对演示
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

 

不可变:

 a.声明映射

b.映射中的键值对称作对偶,用( , )表示

c.当映射中不存在key时,取值会报错,解决方案是使用 contains方法,或者getOrElse方法

可变:

默认使用的映射中的value是不可修改的,位于scala.collection.immutable包中。如果要修改,必须使用位于scala.collection.mutable包中的Map类型

如果要迭代每一个对偶,还是使用for循环

 

学习地址:http://www.runoob.com/scala/scala-maps.html

  
   
   
   
posted @ 2016-11-18 11:32  feihao_itboy  阅读(148)  评论(0)    收藏  举报