1. val和var的区别

val定义的是一个常量,无法改变其内容

  1. scala> val s = 0
  2. s: Int = 0
  3. scala> s = 2
  4. <console>:12: error: reassignment to val
  5. s = 2
  6. ^

如果要声明其值可变的变量,可以使用var

  1. scala> var s = 0
  2. s: Int = 0
  3. scala> s = 5
  4. 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 测试字符串是否相等
  1. object Demo{
  2. def main(args: Array[String]): Unit = {
  3. val s = "hello world";
  4. println(s)
  5. val s1 = "Hello";
  6. val s2 = "Hello";
  7. val s3 = "H"+"ello";
  8. println(s1.equals(s2))
  9. println(s1.eq(s3))
  10. println(s1 == s2)
  11. }
  12. }
  13. 结果:
  14. hello world
  15. true
  16. true
  17. true
  18. Process finished with exit code 0

在Scala中,可以用==方法测试对象的相等性。这与Java中用equals方法比较两个对象不同。

3.2 多行字符串

在Scala中可以使用三个引号创建多行字符串:

  1. object Demo{
  2. def main(args: Array[String]): Unit = {
  3. val s =
  4. """ohh
  5. haha
  6. nonono
  7. """;
  8. println(s)
  9. }
  10. }
  11. 输出结果:
  12. ohh
  13. haha
  14. nonono
  15. Process finished with exit code 0

结果中可以看到每从第二行起每一行都是以空格开头的,要解决这个问题可以这样做:在多行字符串结尾添加stripMargin方法,并且在第一行后面的所有行以管道符"|"开头:

  1. object Demo{
  2. def main(args: Array[String]): Unit = {
  3. val s =
  4. """ohh
  5. |haha
  6. |nonono
  7. """.stripMargin;
  8. println(s)
  9. }
  10. }
  11. 结果:
  12. ohh
  13. haha
  14. nonono
  15. Process finished with exit code 0

如果你不想用"|",你也可以用任意字符:

  1. val s =
  2. """ohh
  3. /haha
  4. /nonono
  5. """.stripMargin("/");

也会有同样的输出效果。

3.3 字符串中的变量替换

Scala支持在字符串中代换变量。

如果某个字符串需要插入变量,需要在该字符串的前面加上字母"s"标志,然后再字符串中放入变量,每个变量都应该以"$"开头。

  1. object Demo{
  2. def main(args: Array[String]): Unit = {
  3. val name = "xiaoming"
  4. val age = 12
  5. var s = s"$name is a man and he is $age years old"
  6. println(s)
  7. }
  8. }
  9. 结果:
  10. xiaoming is a man and he is 12 years old
  11. Process finished with exit code 0

在字符串前面添加"s",其实是在创建一个处理字符串字面量。

在字符串字面量中使用表达式

除了把变量放到字符串中外,还可以用花括号把表达式包起来再放到字符串中。根据官方文档,"${}"内可嵌入任何表达式。

  1. val age = 12
  2. println(s"are you kidding me,I always thought you were only ${age + 1} years old")

字符串插值f

如果有一个需求是不改变原变量的前提下给该值添加两位小数,该如何实现呢?

  1. val weight = 111
  2. println(f"ohh dear,I never realized that you have $weight%.2f kilograms")
  3. 结果:
  4. ohh dear,I never realized that you have 111.00 kilograms

这个简单的需求繁盛了“f字符串插值”。一个可以通过printf个时候内部字符串的方法。

用这种方法只需要如下两步即可:

1.在字符串前面加上字母f。

2.在变量之后使用printf的格式化操作符。

raw插入符

raw插入符“不会对字符串中的字符进行转义”。

  1. scala> s"hello\nyou"
  2. res0: String =
  3. hello
  4. you
  5. scala> raw"hello\nyou"
  6. res1: String = hello\nyou

printf格式化常用字符:

格式化符号 描述
%c 字符
%d 十进制数字
%e 指数浮点数
%f 浮点数
%i 整数
%o 八进制
%s 字符串
%u 无符号十进制
%x 十六进制
%% 打印一个百分号
\% 打印一个百分号
3.4 遍历字符串中的字符

Scala提供了很多方式遍历字符串以及对字符串进行操作,常用的有map,foreach,for,filter。

  1. scala> val s = "you are a kid".map(c => c.toUpper)
  2. s: String = YOU ARE A KID
  3. scala> val s = "you are a kid".map(_.toUpper)
  4. s: String = YOU ARE A KID
  5. scala> val s = "you are a kid".filter(_ != "\n").map(v => v) ^
  6. s: String = you are a kid
  7. val name = "542352354"
  8. for(c <- name){
  9. println(c)
  10. }
  11. name.foreach(println)

4. 数值

Scala内建数值类型包括:

  • Char
  • Byte
  • Short
  • Int
  • Long
  • Float
  • Double
4.1 从字符串到数字

使用String的to*方法。

  1. scala> "200".toInt
  2. res0: Int = 200

如果需要转换的字符串不确定是几进制的,可以通过参数的形式来判断:

  1. val a = Integer.parseInt("01101",2)
  2. println(a)
  3. 结果:
  4. 13
  5. Process finished with exit code 0
4.2 ++和- -

Scala中没有++ 和 - -这样的操作。所以要是想使用的话只能使用变形的方法:数值类型的可以使用 += 或者是 -= 来操作:

  1. var a = 4
  2. a += 3
  3. println(a)
  4. a -= 5
  5. println(a)
  6. 结果:
  7. 7
  8. 2
4.3 处理大数

Scala提供了BigInt和BigDecimal类来创建一个大数:

  1. var a = BigInt(987654321)
  2. var b = BigDecimal(987654321.543433)
  3. var c = a + a
  4. var d = a * a
  5. var e = b + b
  6. var f = b * b
  7. println(a,b,c,d,e,f)
  8. 结果为:
  9. (987654321,987654321.543433,1975308642,975461057789971041,1975308643.086866,975461058863418942.543305425489)

我们看到和java中不一样的是:BigDecimal对象支持所有普通数值类型的操作符。

4.4 生成随机数

Scala中也提供了Random类,用于随机数生成。

  1. var a = Random.nextDouble()
4.5 创建一个数值区间、列表或者数组

使用Int的to方法创建数值区间:

  1. for(i <- 0 to 9){
  2. println(i)
  3. }
  4. 结果:
  5. 0
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 6
  12. 7
  13. 8
  14. 9
  15. Process finished with exit code 0

也可以使用by方法设置步长:

  1. for(i <- 0 to 9 by(2)){
  2. println(i)
  3. }
  4. 结果:
  5. 0
  6. 2
  7. 4
  8. 6
  9. 8
  10. Process finished with exit code 0

不得不说,跟java比是简洁太多了。

5. 控制语句

Scala中的if/else语句和java中的一样使用。

5.1 for循环

Scala中的for循环也很简单,使用"<-"符号来获取循环指针。

  1. var a = Array("liming","hanmeimei","xiaohong")
  2. for(user <- a){
  3. println(user)
  4. }
  5. 结果:
  6. liming
  7. hanmeimei
  8. xiaohong
  9. Process finished with exit code 0

for循环计数器:

  1. for(i <- 0 to 5){
  2. println(i)
  3. }
  4. for(i <- until a.length){
  5. println(i)
  6. }

遍历字符串和数组时,你通常需要使用 0 到 n-1 的区间,这个时候可以使用 until 方法而不是 to 方法。 until 方法返回一个并不包含上限的区间。

封装index和值:

  1. var a = Array("liming","hanmeimei","xiaohong")
  2. for((e,count) <- a.zipWithIndex){
  3. println(e,count)
  4. }
  5. 结果:
  6. (liming,0)
  7. (hanmeimei,1)
  8. (xiaohong,2)
  9. Process finished with exit code 0

遍历Map:

  1. val map = Map("name"->"xiaoming","age"->12,"sex"->1)
  2. for((k,v) <- map){
  3. println(k,v)
  4. }
  5. 结果:
  6. (name,xiaoming)
  7. (age,12)
  8. (sex,1)

在for循环中使用多个计数器:

Scala允许在一个for循环中使用多个计数器,这个有点高端:

  1. var i = 1
  2. var j = 1
  3. var k = 1
  4. for(i <- 1 to 3;j <- 1 to 4;k <- 1 to 5){
  5. println(i,j,k)
  6. }
  7. 结果:
  8. (1,1,1)
  9. (1,1,2)
  10. (1,1,3)
  11. (1,1,4)
  12. (1,1,5)
  13. (1,2,1)
  14. ...
  15. (3,4,2)
  16. (3,4,3)
  17. (3,4,4)
  18. (3,4,5)

当我们创建二维数组或者三维数组,就再也不用像java中那样需要三个for循环了。

for循环中嵌入if:

  1. for(i <- 1 to 10 if i % 2 == 0){
  2. println(i)
  3. }

过滤循环条件。

实现break和continue:

Scala中没有break和continue关键字。但是提供了另外的方式来实现该功能,scala.util.control.Breaks类提供了类似的方法:

  1. import util.control.Breaks._
  2. object Demo{
  3. def main(args: Array[String]): Unit = {
  4. breakable{
  5. for( i <- 1 to 10){
  6. println(i)
  7. if(i == 5)
  8. break
  9. }
  10. }
  11. }
  12. }
  13. 结果:
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. Process finished with exit code 0

注意:break和breakable不是关键字而是util.control.Breaks类中的方法。

再来看一下continue是如何执行的:

  1. import util.control.Breaks._
  2. object Demo{
  3. def main(args: Array[String]): Unit = {
  4. for( i <- 1 to 10){
  5. breakable{
  6. if(i == 5){
  7. break
  8. }else{
  9. println(i)
  10. }
  11. }
  12. }
  13. }
  14. }
  15. 结果:
  16. 1
  17. 2
  18. 3
  19. 4
  20. 6
  21. 7
  22. 8
  23. 9
  24. 10
  25. Process finished with exit code 0

其实就是换了一种方式使用breakable哈。

Scala中的switch/case:

  1. var i = 0
  2. i match {
  3. case 1 => println(1)
  4. case 2 => println(2)
  5. }

在Scala中使用match函数来表示switch。

在Scala中一个case语句可以匹配多个条件,你可以这样用:

  1. var i = 0
  2. i match {
  3. case 1 | 3 | 5 => println(1)
  4. case 2 | 4 | 6=> println(2)
  5. }

使用"|"分割。对于字符串和其他类型使用的语法是一样的。

Scala中的try/catch

使用方式和java基本一样,只是异常的表达形式与java有区别:

  1. try {
  2. val f = new FileReader("input.txt")
  3. } catch {
  4. case ex: FileNotFoundException =>{
  5. println("Missing file exception")
  6. }
  7. case ex: IOException => {
  8. println("IO Exception")
  9. }
  10. }

异常使用case子句的方式来抛出。

Scala基础语法学习(一)的更多相关文章

  1. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  2. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  3. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  4. 1.scala基础语法总结

    Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...

  5. Python 基础语法学习(第一讲)---类的使用

    [写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...

  6. SCALA基础知识学习

    注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...

  7. Java基础语法学习

    Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...

  8. Scala系统学习(三):Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  9. Spark记录-Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

随机推荐

  1. Facebook也炒币吗?Libra币是什么?

    Facebook 在上周发布了加密数字货币,称为 Libra币. 太火爆了,很多人都在关注和讨论,包括一些科技大佬们都很积极的讨论(当然,这里指的是真正的科技大佬,比如 马化腾.王兴等,而不是指哪些割 ...

  2. 深入学习Spring框架(一)- 入门

    1.Spring是什么? Spring是一个JavaEE轻量级的一站式开发框架. JavaEE: 就是用于开发B/S的程序.(企业级) 轻量级:使用最少代码启动框架,然后根据你的需求选择,选择你喜欢的 ...

  3. c++复杂桶排序Java版

    c++复杂桶排序Java版 题目和我的前几个排序一样 这次是Java版的 代码 + 注释 package com.vdian.qatest.supertagbiz.test.niu; /** * Cr ...

  4. JavaScript-浏览器的三种弹窗方式

    //BOM 弹窗 //同步 阻断 alert("alert弹窗"); //返回布尔值 (是/否) var bcf = confirm("confirm弹窗"); ...

  5. NOSQL—MongoDB之外的新选择

    MongoDB之外的新选择 MongoDB拥有灵活的文档型数据结构和方便的操作语法,在新兴的互联网应用中得到了广泛的部署,但对于其底层的存储引擎一直未对外开放,虽说开源却有失完整.Mongo版本3中开 ...

  6. Windows Presentation Foundation (WPF) 项目中不支持xxx的解决

    一般Windows Presentation Foundation (WPF) 项目中不支持xxx都是由于没引用相应的程序集导致,比如Windows Presentation Foundation ( ...

  7. 自实现input上传指定文件到服务器

    遇到问题,解决问题,记录问题,成长就是一步一步走出来的. 一.添加 input 标签 我的工作中遇到了,需要上传pdf文件到服务器的需求,而且只能上传pdf文件,accept指定了 pdf 类型. & ...

  8. MYSQL数据库数据类型

    07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...

  9. [leetcode] 96 Unique Binary Search Trees (Medium)

    原题 字母题 思路: 一开始妹有一点思路,去查了二叉查找树,发现有个叫做卡特兰数的东西. 1.求可行的二叉查找树的数量,只要满足中序遍历有序. 2.以一个结点为根的可行二叉树数量就是左右子树可行二叉树 ...

  10. java - try catch finally 用法

    try { //执行的代码,其中可能有异常.一旦发现异常,则立即跳到catch执行.否则不会执行catch里面的内容 } catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 ...