Scala基础语法学习(一)
1. val和var的区别
val定义的是一个常量,无法改变其内容
scala> val s = 0
s: Int = 0
scala> s = 2
<console>:12: error: reassignment to val
s = 2
^
如果要声明其值可变的变量,可以使用var
scala> var s = 0
s: Int = 0
scala> s = 5
s: Int = 5
在scala中建议使用val,除非你真的想改变他的内容。
2. 基本类型
- Byte 8位有符号补码整数。数值区间为 -128 到 127
- Short 16位有符号补码整数。数值区间为 -32768 到 32767
- Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
- Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
- Float 32位IEEE754单精度浮点数
- Double 64位IEEE754单精度浮点数
- Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
- String 字符序列
- Boolean true或false
- Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
- Null null 或空引用
- Nothing Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
- Any Any是所有其他类的超类
- AnyRef AnyRef类是Scala里所有引用类(reference class)的基类
3.字符串
3.1 测试字符串是否相等
object Demo{
def main(args: Array[String]): Unit = {
val s = "hello world";
println(s)
val s1 = "Hello";
val s2 = "Hello";
val s3 = "H"+"ello";
println(s1.equals(s2))
println(s1.eq(s3))
println(s1 == s2)
}
}
结果:
hello world
true
true
true
Process finished with exit code 0
在Scala中,可以用==方法测试对象的相等性。这与Java中用equals方法比较两个对象不同。
3.2 多行字符串
在Scala中可以使用三个引号创建多行字符串:
object Demo{
def main(args: Array[String]): Unit = {
val s =
"""ohh
haha
nonono
""";
println(s)
}
}
输出结果:
ohh
haha
nonono
Process finished with exit code 0
结果中可以看到每从第二行起每一行都是以空格开头的,要解决这个问题可以这样做:在多行字符串结尾添加stripMargin方法,并且在第一行后面的所有行以管道符"|"开头:
object Demo{
def main(args: Array[String]): Unit = {
val s =
"""ohh
|haha
|nonono
""".stripMargin;
println(s)
}
}
结果:
ohh
haha
nonono
Process finished with exit code 0
如果你不想用"|",你也可以用任意字符:
val s =
"""ohh
/haha
/nonono
""".stripMargin("/");
也会有同样的输出效果。
3.3 字符串中的变量替换
Scala支持在字符串中代换变量。
如果某个字符串需要插入变量,需要在该字符串的前面加上字母"s"标志,然后再字符串中放入变量,每个变量都应该以"$"开头。
object Demo{
def main(args: Array[String]): Unit = {
val name = "xiaoming"
val age = 12
var s = s"$name is a man and he is $age years old"
println(s)
}
}
结果:
xiaoming is a man and he is 12 years old
Process finished with exit code 0
在字符串前面添加"s",其实是在创建一个处理字符串字面量。
在字符串字面量中使用表达式
除了把变量放到字符串中外,还可以用花括号把表达式包起来再放到字符串中。根据官方文档,"${}"内可嵌入任何表达式。
val age = 12
println(s"are you kidding me,I always thought you were only ${age + 1} years old")
字符串插值f
如果有一个需求是不改变原变量的前提下给该值添加两位小数,该如何实现呢?
val weight = 111
println(f"ohh dear,I never realized that you have $weight%.2f kilograms")
结果:
ohh dear,I never realized that you have 111.00 kilograms
这个简单的需求繁盛了“f字符串插值”。一个可以通过printf个时候内部字符串的方法。
用这种方法只需要如下两步即可:
1.在字符串前面加上字母f。
2.在变量之后使用printf的格式化操作符。
raw插入符
raw插入符“不会对字符串中的字符进行转义”。
scala> s"hello\nyou"
res0: String =
hello
you
scala> raw"hello\nyou"
res1: String = hello\nyou
printf格式化常用字符:
| 格式化符号 | 描述 |
| %c | 字符 |
| %d | 十进制数字 |
| %e | 指数浮点数 |
| %f | 浮点数 |
| %i | 整数 |
| %o | 八进制 |
| %s | 字符串 |
| %u | 无符号十进制 |
| %x | 十六进制 |
| %% | 打印一个百分号 |
| \% | 打印一个百分号 |
3.4 遍历字符串中的字符
Scala提供了很多方式遍历字符串以及对字符串进行操作,常用的有map,foreach,for,filter。
scala> val s = "you are a kid".map(c => c.toUpper)
s: String = YOU ARE A KID
scala> val s = "you are a kid".map(_.toUpper)
s: String = YOU ARE A KID
scala> val s = "you are a kid".filter(_ != "\n").map(v => v) ^
s: String = you are a kid
val name = "542352354"
for(c <- name){
println(c)
}
name.foreach(println)
4. 数值
Scala内建数值类型包括:
- Char
- Byte
- Short
- Int
- Long
- Float
- Double
4.1 从字符串到数字
使用String的to*方法。
scala> "200".toInt
res0: Int = 200
如果需要转换的字符串不确定是几进制的,可以通过参数的形式来判断:
val a = Integer.parseInt("01101",2)
println(a)
结果:
13
Process finished with exit code 0
4.2 ++和- -
Scala中没有++ 和 - -这样的操作。所以要是想使用的话只能使用变形的方法:数值类型的可以使用 += 或者是 -= 来操作:
var a = 4
a += 3
println(a)
a -= 5
println(a)
结果:
7
2
4.3 处理大数
Scala提供了BigInt和BigDecimal类来创建一个大数:
var a = BigInt(987654321)
var b = BigDecimal(987654321.543433)
var c = a + a
var d = a * a
var e = b + b
var f = b * b
println(a,b,c,d,e,f)
结果为:
(987654321,987654321.543433,1975308642,975461057789971041,1975308643.086866,975461058863418942.543305425489)
我们看到和java中不一样的是:BigDecimal对象支持所有普通数值类型的操作符。
4.4 生成随机数
Scala中也提供了Random类,用于随机数生成。
var a = Random.nextDouble()
4.5 创建一个数值区间、列表或者数组
使用Int的to方法创建数值区间:
for(i <- 0 to 9){
println(i)
}
结果:
0
1
2
3
4
5
6
7
8
9
Process finished with exit code 0
也可以使用by方法设置步长:
for(i <- 0 to 9 by(2)){
println(i)
}
结果:
0
2
4
6
8
Process finished with exit code 0
不得不说,跟java比是简洁太多了。
5. 控制语句
Scala中的if/else语句和java中的一样使用。
5.1 for循环
Scala中的for循环也很简单,使用"<-"符号来获取循环指针。
var a = Array("liming","hanmeimei","xiaohong")
for(user <- a){
println(user)
}
结果:
liming
hanmeimei
xiaohong
Process finished with exit code 0
for循环计数器:
for(i <- 0 to 5){
println(i)
}
for(i <- until a.length){
println(i)
}
遍历字符串和数组时,你通常需要使用 0 到 n-1 的区间,这个时候可以使用 until 方法而不是 to 方法。 until 方法返回一个并不包含上限的区间。
封装index和值:
var a = Array("liming","hanmeimei","xiaohong")
for((e,count) <- a.zipWithIndex){
println(e,count)
}
结果:
(liming,0)
(hanmeimei,1)
(xiaohong,2)
Process finished with exit code 0
遍历Map:
val map = Map("name"->"xiaoming","age"->12,"sex"->1)
for((k,v) <- map){
println(k,v)
}
结果:
(name,xiaoming)
(age,12)
(sex,1)
在for循环中使用多个计数器:
Scala允许在一个for循环中使用多个计数器,这个有点高端:
var i = 1
var j = 1
var k = 1
for(i <- 1 to 3;j <- 1 to 4;k <- 1 to 5){
println(i,j,k)
}
结果:
(1,1,1)
(1,1,2)
(1,1,3)
(1,1,4)
(1,1,5)
(1,2,1)
...
(3,4,2)
(3,4,3)
(3,4,4)
(3,4,5)
当我们创建二维数组或者三维数组,就再也不用像java中那样需要三个for循环了。
for循环中嵌入if:
for(i <- 1 to 10 if i % 2 == 0){
println(i)
}
过滤循环条件。
实现break和continue:
Scala中没有break和continue关键字。但是提供了另外的方式来实现该功能,scala.util.control.Breaks类提供了类似的方法:
import util.control.Breaks._
object Demo{
def main(args: Array[String]): Unit = {
breakable{
for( i <- 1 to 10){
println(i)
if(i == 5)
break
}
}
}
}
结果:
1
2
3
4
5
Process finished with exit code 0
注意:break和breakable不是关键字而是util.control.Breaks类中的方法。
再来看一下continue是如何执行的:
import util.control.Breaks._
object Demo{
def main(args: Array[String]): Unit = {
for( i <- 1 to 10){
breakable{
if(i == 5){
break
}else{
println(i)
}
}
}
}
}
结果:
1
2
3
4
6
7
8
9
10
Process finished with exit code 0
其实就是换了一种方式使用breakable哈。
Scala中的switch/case:
var i = 0
i match {
case 1 => println(1)
case 2 => println(2)
}
在Scala中使用match函数来表示switch。
在Scala中一个case语句可以匹配多个条件,你可以这样用:
var i = 0
i match {
case 1 | 3 | 5 => println(1)
case 2 | 4 | 6=> println(2)
}
使用"|"分割。对于字符串和其他类型使用的语法是一样的。
Scala中的try/catch
使用方式和java基本一样,只是异常的表达形式与java有区别:
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
}
异常使用case子句的方式来抛出。
Scala基础语法学习(一)的更多相关文章
- 【Scala学习之一】 Scala基础语法
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- 1.scala基础语法总结
Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...
- Python 基础语法学习(第一讲)---类的使用
[写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...
- SCALA基础知识学习
注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...
- Java基础语法学习
Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...
- Scala系统学习(三):Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...
- Spark记录-Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...
随机推荐
- kubeadm安装k8s
软件版本: kubelet:V1.13.3 docker: 18.06.1 实验环境: Centos 7.5.1804 说明: 初学.安装步骤参考了阿良的文档,并做了部分修改. 步骤如下: 1.关闭防 ...
- (转)VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
原文:https://www.cnblogs.com/zsy/p/5958170.html 1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时, ...
- !干货! 为设计指定输入驱动强度 set_driving_cell set_drive set_input_transition
!干货! 为设计指定输入驱动强度 set_driving_cell set_drive set_input_transition 本文转自:自己的微信公众号<集成电路设计及EDA教程> 里 ...
- 影音播放器 Daum Potplayer v1.7.14804 美化便携版
PotPlayer 是一款由世界老牌的著名多媒体影音播放器软件 KMPlayer 的原创作者姜龙喜先生进入韩国多音软件公司后开发的新一代多媒体播放器作品.前者的优势在于内置了功能强大的视频及音频解码器 ...
- 20141111-WCF获得Web路径
在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中调用Server.MapPath 获取服务发布目录路径 在WCF中想使用Server.Map获取当前服务发布目录的绝对路径. ...
- 【06】Jenkins:Gitlab 自动触发构建以及钉钉通知
写在前面的话 在某些时候,我们希望能够实现这样一个功能,当用户提交东西到 gitlab 上的时候,希望它能够自动触发构建,发布到我们需要的环境. 目前我们内部有做类似的需求:产品提交原型到 gitla ...
- 对DatagramSocket的使用实例(java使用UDP进行数据传输)
今天刚看懂的一点点东西,记录一下,方便自己回顾 客户端: Client.java import java.io.IOException; import java.net.DatagramPacket; ...
- [机器学习] k-近邻算法(knn)
最近在参加大数据的暑期培训,记录一下学习的东西. 引言 懒惰学习法:简单的存储数据,并且一直等待,直到给定一个检验数据,才进行范化,以便根据与存储的训练元组的相似性对该检验数据进行分类.懒惰学习法在 ...
- [HDU4135]CO Prime(容斥)
也许更好的阅读体验 \(\mathcal{Description}\) \(t\)组询问,每次询问\(l,r,k\),问\([l,r]\)内有多少数与\(k\)互质 \(0<l<=r< ...
- html+css-->background-img(背景图的设置)
背景图:(相关验证代码请查看代码,在验证时需将当前不需要验证的代码注释掉) 1.inherit:从父元素继承属性设置 2.background-repeat:平铺(在图片大小小于元素尺寸时 ...