Scala学习笔记1-基础介绍,读写文件,集合框架(Array,List,Tuple,Set,Map)

最近整理了电脑里关于scala中的笔记和资料,这里写点简要的小结。

1.scala的基础介绍

Scala是一种针对JVM 将函数和面向对象技术组合在一起的编程语言。
Scala火的原因:Scala是Spark和Kafka的原生语言。
scala拥有和java一样的数据类型,和java的数据类型的内存布局完全一致,精度也完全一致。
在scala中,val声明常量,var声明变量,def 函数声明
下面这张图是scala函数的一个简单案例:
scala函数模型图
操作符:scala中 a 方法 b 等同于 a.方法(b)例如:val sum=5+3 等同于 val sum=5.+(3)
还有一点注意的是,和java不同,Scala中没有++和—操作符,当需要递增或递减时,可采用:i+=1/i-=1
Scala中的打印语句: print(“”); println(“”); printf(“***”);

2.scala读写文件

2.1写入文本文件

scala中使用java.io.PrinterWriter实现把数据写入到文本文件中

import java.io.PrinterWriter
val out=new PrinterWriter(“D:\\scala\\output.txt”)
for(i <- 1 to 10) out.println(i)
out.close()

注意:必须要执行out.close()语句,才会看到output.txt文件被生成,如果没有执行out.close()语句,我们就无法看到生成的output.txt文件。

2.2读取文本文件

scala中可以使用Scala.io.Source的getLines方法实现对文件中所有行的读取

import scala.io.Source
val inputFile=Source.fromFile(“output.txt”)
val lines=inputFile.getLines  //返回的结果是一个迭代器
for(i <- lines) print(i)

3.函数简化

Scala中,可以不写return,如果不写return 则自动将最后计算的结果作为返回值,如果没有返回值,则函数的返回类型为Unit,类似于Java和C#中void。
简单点说:Unit等价于void,表示空类型
在scala内部 像python一样具有变量 函数类型推断机制,我们在声明一个变量时 不需要显示的去定义变量是何种类型,编辑器内部会自行进行判断。例如:
val x:Int=12
等价于 val x=12

4.集合框架

4.1 数组Array

在scala中,数组包括定长数组和不定长数组,默认是为定长数组(Imutable)
若要定义可变数组,需要显示导入包import scala.collection.mutable._
使用new来实例化一个类,当你创建一个对象的实例时,你可以使用数值或者类型。例如:val abc=new ArrayString
abc(0)=”aaaa” abc(1)=“bbb” abc(2)=”ccc”
for(i<- 0 to 2) println(abc(i))
也可以利用初始化数组简单的方法,与上例效果等同:val abc = Array(“aaa”,“bbb”,"ccc”)
以下我也写个demo便于理解:

import scala.collection.mutable.ArrayBuffer
object ArrayLearn {
  def main(args: Array[String]): Unit = {
    val arr = Array("scala", "spark","storm","flink") //定长数组
    val arrayBuf = ArrayBuffer[Int]() //这里定义的是可变数组

    arr(0)="hadoop";
    arr.toBuffer  //将定长数组转换为可变数组
    for(i <- 0 until  arr.length) //until不到arr.length 这里为正确表示,to会报错
      println(arr(i))   //遍历
    println("----------------------------")
    for (elem <- arr) {//遍历
      println(elem)
    }
    println("----------------------------")
    arrayBuf += 1 //可变数组可以用+=在尾端添加元素
    arrayBuf += (2, 3, 4, 5) //可变数组可以用+=在尾端添加多个元素
    arrayBuf ++= Array(6, 7, 8, 9, 10) //可变数组可以用++=在尾端添加任何集合
    println("arrayBuf:" + arrayBuf)
    arrayBuf.trimEnd(2) //移除最后的2个元素
    println("arrayBuf:" + arrayBuf)
    arrayBuf.remove(2) //移除下标为2的元素
    println("arrayBuf:" + arrayBuf)
    arrayBuf.remove(2, 4) //移除熊下标2元素开始的4个元素
    arrayBuf.toArray //将可变数组转换为不可变数组
    println("arrayBuf:" + arrayBuf)
  }
}

4.2 列表List

Scala的List和Java不同,不能被改变,这样做的一个好处是方法与方法之间关联性较小,从而方法变得更可靠和重用性高,使用这个规则也就意味着变量的设置是不可修改的,这也就避免了多线程访问的互锁问题。
:::方法表示连接两个列表,当然列表定义了::方法(右操作符),用于向列表添加元素

object ListLearn {
  def main(args: Array[String]): Unit = {
    val fruit=List("aaa","bbb","ccc")
    val num=List(1,2,3,4,5)
    val dim=List(List(1,0,0),List(0,1,0),List(0,0,1)) //这里是定义二维列表
    println("fruit: "+fruit)
    println("num: "+num)
    println("dim: "+dim)

    val num02=10::num //允许元素进行左添加 也就是向头部添加新的元素
    println("num02: "+num02)
    val num03=num:::num02   //使用:::操作符对不同的列表进行连接得到新的列表
    println("num03: "+num03)

    for(i <- num03) //for循环  逐个遍历 输出值
      print(i+" ")
    println()
  }
}

4.3 元组Tuples

Scala中另外一个很有用的容器类是Tupels, Tuples在方法需要返回多个结果时非常有用(Tuple对应数学的矢量的概念)
一旦定义了一个元组,可以使用._和索引来访问元组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)例如:

val tuple = ("BigData",2015,45.0)
println(tuple._1) 	println(tuple._2)	

注意:定义一个List和Tuple,内部都可以包含不同的元素

4.4 集合(set)

集合(set)是不可重复元素的集合。列表中的元素是按照插入的先后顺序来组织的,但是,”集合”中的元素并不会记录元素的插入顺序,而是以“哈希”方法对元素的值进行组织,所以,它允许你快速地找到某个元素。
集合包括可变集合和不可变集合,缺省情况下创建的是不可变集合。
如果要声明一个可变集,则需要引入scala.collection.mutable.Set包。

/**
  * 集合(Set)简单运用
  * 集合包括可变集合和不可变集合,缺省情况下创建的是不可变集合
  * 这个demo创建的 不可变集合
  * @author xjh 2018.10.16
  */
object SetLearn {
  def main(args: Array[String]): Unit = {
    var mySet=Set("Hadoop","Spark")
    //因为是不可变集合 所以这里要用var定义变量 如果定义的是val会报错
    mySet+="Scala"
    println(mySet)    //这里原理实则和java的String一样 在内存中开辟一个新的内存空间存放数据
    println(mySet.contains("Spark"))
  }
}
import scala.collection.mutable.Set
/**
  *可变集合 需要引入scala.collection.mutable.Set包
  * @author xjh 2018.10.16
  */
object SetLearn02 {
  def main(args: Array[String]): Unit = {
    val set=Set("abc","ABC")
    set+="123"
    println("set : "+set)
  }
}

4.5 映射(map)

在Scala中,映射(Map)是一系列键值对的集合,也就是,建立了键和值之间的对应关系。在映射中,所有的值,都可以通过键来获取。
映射包括可变和不可变两种,默认情况下创建的是不可变映射,如果需要创建可变映射,需要引入scala.collection.mutable.Map包

/**
  * 映射map包括可变和不可变两种,默认情况下创建的是不可变映射。
  *  如果需要创建可变映射,需要引入scala.collection.mutable.Map包
  * @author xjh 2018.10.16
  */
object MapLearn {
  def main(args: Array[String]): Unit = {
    println("---------------不可变map------------------")
    val bigData = Map("scala" -> 35, "Hadoop" -> 30, "spark" -> 40)
    println(bigData)
    println(bigData("scala")) //map中通过key获得value
    println(bigData.contains("Hadoop")) //是否包含给定的值
    println(bigData.getOrElse("spark001", 70)) //通过key获得值,如果不包含给定key,则返回给定的值
    println(bigData.mkString("{", ",", "}"))
    println(bigData.drop(2))

    println("---------构造可变集合----------")
    val bigDataVar = scala.collection.mutable.Map("scala" -> 35, "Hadoop" -> 30, "spark" -> 50)
    println(bigDataVar)
    bigDataVar("spark") = 100 //更新键值对,如果不存在则添加
    bigDataVar += ("Kafka" -> 90) //使用+=添加
    for ((k, v) <- bigDataVar) {
      print(k + ":" + v+"; ")
    }
    println()
    for (a <- bigDataVar.keySet) {
      println(a) //只输出key
    }
  }
}

下一篇写scala中 有关 类与对象 函数式编程
参考文献:子雨大数据之Spark入门教程(Scala版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值