首页 > 其他分享 >四天过完scala语法(第一天)

四天过完scala语法(第一天)

时间:2022-11-29 20:44:57浏览次数:54  
标签:java 字面 val Scala scala 语法 io 四天

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都会自动添加一些引用,这样,就相当于在每个程序源文件的顶端都增加了一行下面的代码:

  1. 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类来表示字符串。


这里要明确什么是“字面量”?字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、符号字面量、函数字面量和元组字面量。举例如下:

  1. val i = 123 //123就是整数字面量
  2. val i = 3.14 //3.14就是浮点数字面量
  3. val i = true //true就是布尔型字面量
  4. val i = 'A' //'A'就是字符字面量
  5. val i = "Hello" //"Hello"就是字符串字面量

Scala允许对“字面量”直接执行方法,比如:

  1. 5.toString() //产生字符串"5"
  2. "abc".intersect("bcd") //输出"bc"

上面的intersect()方法用来输出两个字符串中都存在的字符。

操作符

在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等操作符,而且,这些操作符就是方法。例如,5 + 3和(5).+(3)是等价的,也就是说:

a 方法 b
a.方法(b)

上面这二者是等价的。前者是后者的简写形式,这里的+是方法名,是Int类中的一个方法。具体代码如下:

  1. scala> val sum1 = 5 + 3 //实际上调用了 (5).+(3)
  2. sum1: Int = 8
  3. scala> val sum2 = (5).+(3) //可以发现,写成方法调用的形式,和上面得到相同的结果
  4. sum2: Int = 8

需要注意的是,和Java不同,在Scala中并没有提供++和--操作符,当需要递增和递减时,可以采用如下方式表达:

  1. scala> var i = 5;
  2. i: Int = 5
  3. scala> i += 1 //将i递增
  4. scala> println(i)
  5. 6

此外,也可以使用关系和逻辑操作,比如,大于(>)、小于(<)、大于等于(>=)和小于等于(<=),会产生Boolean类型的结果。

 

3. Range

在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。

在创建Range时,需要给出区间的起点和终点以及步长(默认步长为1)。下面通过几个实例来介绍:
(1)创建一个从1到5的数值序列,包含区间终点5,步长为1

  1. scala> 1 to 5
  2. res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

之前我们已经介绍过,在Scala中允许对“字面量”直接执行方法,所以,上面的代码,也可以用下面的代码来实现:

  1. scala> 1.to(5)
  2. res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1

  1. scala> 1 until 5
  2. res1: scala.collection.immutable.Range = Range(1, 2, 3, 4)

(3)创建一个从1到10的数值序列,包含区间终点10,步长为2

  1. scala> 1 to 10 by 2
  2. res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.8f

    1. scala> 0.5f to 5.9f by 0.8f
    2. 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解释器进入命令提示符状态后,输入以下代码:

  1. scala> import java.io.PrintWriter
  2. import java.io.PrintWriter //这行是Scala解释器执行上面语句后返回的结果
  3. scala> val out = new PrintWriter("output.txt")
  4. out: java.io.PrintWriter = java.io.PrintWriter@25641d39 //这行是Scala解释器执行上面语句后返回的结果
  5. scala> for (i <- 1 to 5) out.println(i)
  6. scala> out.close()
scala

上面代码中,new PrintWriter("output.txt")中只给出了文件名,并没有给出文件路径,采用相对路径,这时,文件就会被保存到启动Scala REPL时的当前目录下。比如,如果我们是进入“/home/hadoop”用户目录,在这个目录下启动进入了Scala REPL交互式执行环境,则上面代码执行结束后,可以在hadoop用户的工作目录“/home/hadoop/”下找到新生成的这个output.txt文件。为了查看这个文件,我们可以在当前“终端”窗口的基础上,再新建一个终端窗口,你可以在当前终端窗口的左上角看到一个菜单,点击“终端”,选择“新建终端”,就可以打开第二个命令行终端窗口(用来查看文件)。
现在,让我们切换到第二个终端窗口,然后,输入下面命令进入到hadoop用户的工作目录,并显示该目录下的所有文件和文件夹信息:

  1. cd ~
  2. ls
Shell 命令

"~"就表示当前用户的工作目录,对于hadoop用户而言,就是“/home/hadoop/”目录。
上面命令执行后,就可以发现,“/home/hadoop/”目录下有个新生成的这个output.txt文件,下面使用cat命令查看该文件内容:

  1. cat output.txt
Shell 命令

需要注意的是,必须要执行out.close()语句,才会看到output.txt文件被生成,如果没有执行out.close()语句,我们就无法看到生成的output.txt文件。
如果我们想把文件保存到一个指定的目录下,就需要给出文件路径,代码如下:

  1. scala> import java.io.PrintWriter
  2. import java.io.PrintWriter //这行是Scala解释器执行上面语句后返回的结果
  3. scala> val out = new PrintWriter("/usr/local/scala/mycode/output.txt")
  4. out: java.io.PrintWriter = java.io.PrintWriter@25641d39 //这行是Scala解释器执行上面语句后返回的结果
  5. scala> for (i <- 1 to 5) out.println(i)
  6. scala> out.close()

上述过程执行结束后,就可以到“/usr/local/scala/mycode/”这个目录下找到output.txt文件。

读取文本文件中的行

可以使用Scala.io.Source的getLines方法实现对文件中所有行的读取。
仍然假设当前是用hadoop用户登录了Linux系统,并且使用scala命令启动了Scala解释器,现在,我们要把上面刚生成的、在hadoop用户工作目录下的output.txt文件读取出来,下面给出了完整的读取文件实例代码:

    1. scala> import scala.io.Source
    2. import scala.io.Source //这行是Scala解释器执行上面语句后返回的结果
    3. scala> val inputFile = Source.fromFile("output.txt")
    4. inputFile: scala.io.BufferedSource = non-empty iterator //这行是Scala解释器执行上面语句后返回的结果
    5. scala> val lines = inputFile.getLines //返回的结果是一个迭代器
    6. lines: Iterator[String] = non-empty iterator //这行是Scala解释器执行上面语句后返回的结果
    7. scala> for (line <- lines) println(line)
    8. 1
    9. 2
    10. 3
    11. 4
    12. 5

 

 

 

标签:java,字面,val,Scala,scala,语法,io,四天
From: https://www.cnblogs.com/yinhuachen/p/16936609.html

相关文章

  • Markdown 语法测试、备忘
    MarkdownCrashTestBenchmarkingthesupportofMarkdownwithacomprehensivechecklistYou'reworkingonaprojectfeaturingMarkdown?Dropthesourceofthis......
  • 大数据之脚踏实地学18--Scala正则表达式的使用
    前言在《​​大数据之脚踏实地学17--Scala字符串的清洗​​》一文中我们介绍了Scala语言中常用的字符串处理方法,但这些方法并不是万能的,例如字符串子串的获取,如果目标子串并......
  • 代码随想录算法训练营第十四天 | 理论基础 递归遍历 迭代遍历 统一迭代
    今日内容:●理论基础●递归遍历●迭代遍历●统一迭代详细布置理论基础需要了解二叉树的种类,存储方式,遍历方式以及二叉树的定义文章讲解:https://pro......
  • Flex 布局教程:语法篇
    Flex布局教程:语法篇转载自:阮一峰的网络日志Flex布局教程:语法篇网页布局(layout)是CSS的一个重点应用。布局的传统解决方案,基于盒状模型,依赖display属性+po......
  • Java基础语法(2)数据类型
         ......
  • markdown语法整理
    目录一、前言二、Markdown基本语法2.1标题2.2加粗2.3斜体2.4高亮2.5上标2.6下标2.7代码引用(>式)2.8代码引用(```式)2.9代码引入(`式)2.10插入链接(链接显......
  • Vue模板语法
     Vue模板语法有2大类:          1.插值语法:              功能:用于解析标签体内容。         ......
  • javaSE基础-语法基础
    基础语法Java语言出现于1991年,JDK1.0版本正式发布于1995年Java之父:JamesGosling(詹姆斯•高斯林)Java是一种面向对象的编程语言Java语言是一种编译解释型语言Java语......
  • 想体验ES6语法?那用gulp+Babel来搭建ES6环境吧~
    参考:​​ES6初体验——gulp+Babel搭建ES6环境​​​​gulp-load-plugins模块化管理插件​​那至于怎么使用gulp构建工具这一问题这里就略过咯(可以参考我之前发过的......
  • 语法糖
          在方法的参数和返回值上,可利用反射获取泛型信息                               ......