1. 生命值和变量
val:是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值;
var:是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值。(注意:var变量在声明的时候也需要初始化)
val myStr = "Hello World!"
注意的是,尽管我们在第1行代码的声明中,没有给出myStr是String类型,但是,Scala具有“类型推断”能力,可以自动推断出变量的类型。
当然,我们也可以显式声明变量的类型:
val myStr2 : String = "Hello World!"
需要说明的是,上面的String类型全称是java.lang.String,也就是说,Scala的字符串是由Java的String类来实现的,因此,我们也可以使用java.lang.String来声明,具体如下:
val myStr3 : java.lang.String = "Hello World!"
但是,为什么可以不用java.lang.String,而只需要使用String就可以声明变量呢?这是因为,在每个应用程序中,Scala都会自动添加一些引用,这样,就相当于在每个程序源文件的顶端都增加了一行下面的代码:
- import java.lang._ //java.lang包里面所有的东西
2. 基本数据类型和操作
Scala的数据类型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean。和Java不同的是,在Scala中,这些类型都是“类”,并且都是包scala的成员,比如,Int的全名是scala.Int。对于字符串,Scala用java.lang.String类来表示字符串。
这里要明确什么是“字面量”?字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量。举例如下:
- val i = 123 //123就是整数字面量
- val i = 3.14 //3.14就是浮点数字面量
- val i = true //true就是布尔型字面量
- val i = 'A' //'A'就是字符字面量
- val i = "Hello" //"Hello"就是字符串字面量
Scala允许对“字面量”直接执行方法,比如:
- 5.toString() //产生字符串"5"
- "abc".intersect("bcd") //输出"bc"
上面的intersect()方法用来输出两个字符串中都存在的字符。
操作符
在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等操作符,而且,这些操作符就是方法。例如,5 + 3和(5).+(3)是等价的,也就是说:
a 方法 b
a.方法(b)
上面这二者是等价的。前者是后者的简写形式,这里的+是方法名,是Int类中的一个方法。具体代码如下:
- scala> val sum1 = 5 + 3 //实际上调用了 (5).+(3)
- sum1: Int = 8
- scala> val sum2 = (5).+(3) //可以发现,写成方法调用的形式,和上面得到相同的结果
- sum2: Int = 8
需要注意的是,和Java不同,在Scala中并没有提供++和--操作符,当需要递增和递减时,可以采用如下方式表达:
- scala> var i = 5;
- i: Int = 5
- scala> i += 1 //将i递增
- scala> println(i)
- 6
此外,也可以使用关系和逻辑操作,比如,大于(>)、小于(<)、大于等于(>=)和小于等于(<=),会产生Boolean类型的结果。
3. Range
在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。
在创建Range时,需要给出区间的起点和终点以及步长(默认步长为1)。下面通过几个实例来介绍:
(1)创建一个从1到5的数值序列,包含区间终点5,步长为1
- scala> 1 to 5
- res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
之前我们已经介绍过,在Scala中允许对“字面量”直接执行方法,所以,上面的代码,也可以用下面的代码来实现:
- scala> 1.to(5)
- res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1
- scala> 1 until 5
- res1: scala.collection.immutable.Range = Range(1, 2, 3, 4)
(3)创建一个从1到10的数值序列,包含区间终点10,步长为2
- scala> 1 to 10 by 2
- res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.8f
- scala> 0.5f to 5.9f by 0.8f
- res3: scala.collection.immutable.NumericRange[Float] = NumericRange(0.5, 1.3, 2.1, 2.8999999, 3.6999998, 4.5, 5.3
4. 打印语句
在Scala编程中,经常需要用到打印语句。
print("My name is:")
print("Ziyu")
上述代码执行后,会得到连在一起的一行结果,如下:
My name is Ziyu
如果要每次打印后追加一个换行符,实现换行的效果,就要采用println语句,如下:
println("My name is:")
println("Ziyu")
上述代码执行后,会得到两行结果,如下:
My name is
Ziyu
如果要打印整型变量的值,可以使用下面语句:
val i = 7
println(i)
此外,Scala还带有C语言风格的格式化字符串的printf函数:
val i = 5;
val j = 8;
printf("My name is %s. I hava %d apples and %d eggs.\n","Ziyu",i,j)
上面语句执行后会得到如下结果:
My name is Ziyu. I hava 5 apples and 8 eggs.
更多关于printf函数的使用方法,读者可以参考C语言书籍。
总结,scala可以使用 print, println, printf。
5. 读写文件
Scala需要使用java.io.PrintWriter实现把数据写入到文本文件。
假设当前正使用用户名hadoop登录Linux系统,打开Scala解释器进入命令提示符状态后,输入以下代码:
- scala> import java.io.PrintWriter
- import java.io.PrintWriter //这行是Scala解释器执行上面语句后返回的结果
- scala> val out = new PrintWriter("output.txt")
- out: java.io.PrintWriter = java.io.PrintWriter@25641d39 //这行是Scala解释器执行上面语句后返回的结果
- scala> for (i <- 1 to 5) out.println(i)
- scala> out.close()
上面代码中,new PrintWriter("output.txt")中只给出了文件名,并没有给出文件路径,采用相对路径,这时,文件就会被保存到启动Scala REPL时的当前目录下。比如,如果我们是进入“/home/hadoop”用户目录,在这个目录下启动进入了Scala REPL交互式执行环境,则上面代码执行结束后,可以在hadoop用户的工作目录“/home/hadoop/”下找到新生成的这个output.txt文件。为了查看这个文件,我们可以在当前“终端”窗口的基础上,再新建一个终端窗口,你可以在当前终端窗口的左上角看到一个菜单,点击“终端”,选择“新建终端”,就可以打开第二个命令行终端窗口(用来查看文件)。
现在,让我们切换到第二个终端窗口,然后,输入下面命令进入到hadoop用户的工作目录,并显示该目录下的所有文件和文件夹信息:
- cd ~
- ls
"~"就表示当前用户的工作目录,对于hadoop用户而言,就是“/home/hadoop/”目录。
上面命令执行后,就可以发现,“/home/hadoop/”目录下有个新生成的这个output.txt文件,下面使用cat命令查看该文件内容:
- cat output.txt
需要注意的是,必须要执行out.close()语句,才会看到output.txt文件被生成,如果没有执行out.close()语句,我们就无法看到生成的output.txt文件。
如果我们想把文件保存到一个指定的目录下,就需要给出文件路径,代码如下:
- scala> import java.io.PrintWriter
- import java.io.PrintWriter //这行是Scala解释器执行上面语句后返回的结果
- scala> val out = new PrintWriter("/usr/local/scala/mycode/output.txt")
- out: java.io.PrintWriter = java.io.PrintWriter@25641d39 //这行是Scala解释器执行上面语句后返回的结果
- scala> for (i <- 1 to 5) out.println(i)
- scala> out.close()
上述过程执行结束后,就可以到“/usr/local/scala/mycode/”这个目录下找到output.txt文件。
读取文本文件中的行
可以使用Scala.io.Source的getLines方法实现对文件中所有行的读取。
仍然假设当前是用hadoop用户登录了Linux系统,并且使用scala命令启动了Scala解释器,现在,我们要把上面刚生成的、在hadoop用户工作目录下的output.txt文件读取出来,下面给出了完整的读取文件实例代码:
- scala> import scala.io.Source
- import scala.io.Source //这行是Scala解释器执行上面语句后返回的结果
- scala> val inputFile = Source.fromFile("output.txt")
- inputFile: scala.io.BufferedSource = non-empty iterator //这行是Scala解释器执行上面语句后返回的结果
- scala> val lines = inputFile.getLines //返回的结果是一个迭代器
- lines: Iterator[String] = non-empty iterator //这行是Scala解释器执行上面语句后返回的结果
- scala> for (line <- lines) println(line)
- 1
- 2
- 3
- 4
- 5
标签:java,字面,val,Scala,scala,语法,io,四天 From: https://www.cnblogs.com/yinhuachen/p/16936609.html