学习笔记四——scala基础学习

  今天学习了scala语言的一些基础知识,进行总结。

  (1)声明值与变量

    变量类型Scala解释器会自动解析,类型写不写都可以。

    val变量:声明时必须初始化,之后不可改变(不可重新赋值)。

    

    

    var变量:声明时可初始化,之后可以改变(重新赋值)。

    

  (2)intersect函数:设A、B都为字符串变量,A.intersect(B)为字符串A与B相同部分。

    例:

    

   (3)运算符运算+、-、*、/、>、<

     表达式a+b等价于表达式(a).+(b);

     表达式a-b 等价于表达式(a).-(b);

     a>b、a<b返回值为表达式真假(true或false);

   (4)多行输入统一运行方法:输入“:paste”进入多行输入模式,按键“Ctrl+D”退出多行输入模式。例如:

    

   (5)读写文件

     写入文件:

1 import java.io.PrintWriter;
2 val out = new PrintWrinter("output.txt")//output.txt为文件名,默认新建文档保存到进入spark前所处目录下。
3 //val out = new PrintWriter("path/output.txt")//path为指定路径,表示写入指定目录下的output.txt文档。
4 for(i <- 1 to 5)out.println(i)
5 out.close();//关闭输入流才可以查看到    

  

 读取文件:

1 import scala.io.Source
2 val inputFile = Source.fromFile("output.txt")//建立输出流
3 val lines = inputFile.getLines//返回结果
4 for(line <- lines)println(line)//输出

  

  (6)需要注意的是,在Scala中,对数组元素的应用,是使用圆括号,而不是方括号,也就是使用intValueArr(0),而不是intValueArr[0],这个和Java是不同的。

1  val myStrArr = new Array[String](3) //声明一个长度为3的字符串数组,每个数组元素初始化为null
2  myStrArr(0) = "BigData"
3  myStrArr(1) = "Hadoop"
4  myStrArr(2) = "Spark"

  (7)列表的使用

    注:列表中各个元素必须为同一类型(但是在我的尝试中发现定义一个列表时,内部元素可以为不同类型,我在网上也没有找到答案

    

    ①声明列表:

1 var list1 = List(1,2,3)
2 var list2 = 1::2::3::Nil

    ②使用list.head来获取上面定义的列表的头部,list.tail获取列表的尾部。

    ③使用“::”在列表头部前添加新头部,如:0::list

    ④使用“:::”连接两个列表,如:list1:::list2

    ⑤使用list.sum可以求列表内数据的和(字符、字符串不可用)

    示例:

    

    (8)元组的使用

    注:元组内部各个元素可以为不同类型    

    定义与列表定义相同,但是可以存储不同类型元素。不可以使用“::”或“:::”

    获取元组的某一元素格式为:“变量名._元素下标”(元素下标从1开始)

    

    (9)映射的使用

     映射(Map)是一系列键值对的集合,也就是,建立了键和值之间的对应关系。在映射中,所有的值,都可以通过键来获取。

     映射默认为不可变,如果需要创建可变映射,需要引入scala.collection.mutable.Map包。

     格式:

var map1 = Map("1" -> "a","2" -> "b","3" -> "c")

     获取值使用:

print(map1("1"))

     例如:

        

 总结

   今天学习了一些scala的基础语法知识,scala语言与java语言有很多共同之处,还是很容易的。但是在学习过程中也遇到了一些令人烦恼的问题。

   列表List、元组tuple、集Set、映射Map

   列表与元组声明后是不可变的,集与映射默认是不可变的,但是可以通过引入包而变得可变,但是在学习过程中我发现通过var定义的这些列表变量、元组变量、集变量、映射变量都是可变的(不会报错),经过网上搜索后,发现了其中的问题。变量的声明var与val其实是指针。就拿集来说,声明一个集,不导入包,本身应是不可变的,但是却增加了:

var mySet = Set("Hello","World");
 mySet += "Scala";

   

   使用val的时候

val mySet = Set("Hello","World");
mySet += "Scala"

   

   其实,使用var的时候,不可变的集mySet本身没有变,只是var由一开始的指向Set("Hello","World")变为了指向Set("Hello","World","Scala")。其它同理。

原文地址:https://www.cnblogs.com/liyuchao/p/12256522.html