scala 是 scalable Language 的简写,是一门多范式的编程语言. scala是一种纯面向对象的语言每个值都是对象, 同时支持大量的函数式特性.

scala运行于Java虚拟机(JVM)之上, 并依赖和支持大量Java包。搭建scala运行环境时需要首先安装Java运行环境.

scala拥有交互式方式和脚本两种执行方式,命令行提示符为scala>, 脚本通常以.scala作为后缀名.

scala的语法与Java类似, 但以以换行或分号标志语句的结束,使用花括号{}标志代码块, 语义与缩进无关, 禁止使用\将一行语句拆为多行(\是合法的scala标识符).

scala支持//引导的单行注释, 和/*, */引导的多行注释。

在Linux和OS X系统上可以使用包管理器安装scala:

apt-get install scala
brew install scala

在命令行输入scala命令进入scala交互环境:

scala> println("Hello World")
Hello World scala> 1 + 1
res5: Int = 2

编写脚本Hello.scala

object HelloWorld {

   def main(args: Array[String]) {
println("Hello World!")
} }

在终端中编译执行:

$ scalac hello.scala
$ ls
HelloWorld$.class HelloWorld.class hello.scala
$ scala HelloWorld
Hello World!

scala源文件与Java一样, 所有的语句均包含在对象内。编译完成后每个类会生成独立的class文件。类中的main函数为执行的入口函数。

scala 数据类型

标识符区分大小写,以字母或_$开头, 后续字符可以为数字,字母或_$. $开头的标识符通常为内置标识符,应尽量避免以$开头. _ 为scala保留字, 不能单独作为标识符.

我们可以在``之间使用任何有效的 scala 标识符, 一个典型例子为 Thread 的 yield 方法, 因为 yield 为 scala 中的关键字, 无法使用Thread.yield()必须使用 Thread.`yield`() 来使用这个方法.

在 scala 中,使用关键词 var 声明变量,使用关键词 val 声明常量. scala为静态强类型语言, 变量类型一旦声明无法更改.

scala> var a = 1
a: Int = 1
scala> var b:Int = 2
b: Int = 2

scala的局部变量必须在声明时指定初值, 只有类属性可以只声明类型不指定初值.

如示例中第二条语句,在声明时中可以使用: Type指定变量类型, 在大多数情况下编译器会根据初值自行推断类型。

scala支持多变量同时声明和声明元组:

scala> var (x, y) = (0, 0)
x: Int = 0
y: Int = 0
scala> var x, y = 0
x: Int = 0
y: Int = 0

scala内置的类型包括:

  • 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

scala中还有一些特殊的类型:

  • Null: null 或空引用

  • Nothing: 任何其他类型的子类型。

  • Any: 所有其他类的超类

  • AnyRef: 所有引用类(reference class)的基类

scala定义了一些字面量的语法:

  • 整型字面量: 默认为Int类型, 加Ll后缀为Long类型, 支持10进制和16进制写法,8进制写法已被废弃.

    示例: 123, 0xFF, 123L

  • 浮点字面量: 默认为Double类型, 加Ff后缀为Float型.

    示例: 2.718, 2.718F, 1F, 2D, -1.2

  • 字符字面量: 一对单引号包括的单个字符, 支持转义字符, 也可以用可以使用4位16进制数表示

    示例: 'a', '\n', '\u0038'

  • 字符串字面量: 一对双引号包含的字符串, 支持转义字符:

    示例: "Hello World\n"

  • Null与逻辑值: null, true, false

  • 符号字面量: scala.Symbol的简写, 使用'引导一个标识符。

    示例: 'a 等价于 scala.Symbol("a")

scala的运算符系统与Java非常类似, 保留了位运算符,取余%以及复合赋值,但是不支持++--

赋值运算返回Unit, 不支持连续赋值。

流程控制

Scala的流程控制与Java基本相同。

if

if (score > 80) {
rank = "excellent"
}
else if (score > 60) {
rank = "good"
}
else {
rank = "fail"
}

while

while (i <= 100) {
s += i;
i += 1;
}
do {
s += i;
i += 1;
} while (i <= 100);

for

scala 的for循环很独特值得一提.

scala> for (i <- 1 until 10) { println(i); }
1
2
3
...
9

until不包含结尾数字, to则包含结尾数字.

scala> for (i <- 1 to 10) { println(i); }
1
2
3
...
10

for 循环同样可以用来遍历集合:

scala> var arr = List(1, 2, 3, 4)
arr: List[Int] = List(1, 2, 3, 4) scala> for (i <- arr) {println(i);}
1
2
3
4

可以设置多个循环变量和循环域, 从而简化嵌套循环的语法:

scala> for (i <- 1 to 2; j <- 1 to 3) { print(i); println(j); }
11
12
13
21
22
23

for 循环中可以嵌入条件判断:

scala> for (i <- 0 until 5 if i % 2 == 0;if i != 0) { println(i) }
2
4

yield关键字与for循环搭配可以生成容器, 首先需要认识到for循环是有返回值的:

var r = for (i <- 1 until 3) {}
r: Unit = ()

yield关键字可以将一个表达式的返回值填入返回的容器:

var r = for (i <- 1 until 3) yield i
r: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2)

break, continue

谢谢, scala中并没有这两个关键字. 我们需要使用if语句和标记来代替它们的功能.

模式匹配

scala模式匹配提供了类似于switch的流程控制:

scala> val s = 'B';
s: Char = B
scala> s match {
| case 'A'=> "Apple"
| case 'B'=> "Bravo"
| case 'C'=> "Company"
| case 'D'=> "Delta"
| case _ => "..."
| }
res15: String = Bravo

当s与match中的某一个case匹配时, match语句即返回case对应的值.

自定义case class可以定义样例类代替内置类型进行模式匹配.

包管理

scala采用与Java类似的包管理机制,将package语句放在文件头声明文件中所有类都属于该包:

package pw.finley

或者声明:

package pw.finley {
class Hello;
}

scala 使用 import 关键字引用包, scala可以自由引用java包:

scala> import java.awt.Color  // import class Color

scala> import java.awt._   // import all classes in java.awt

scala>

import语句可以出现在任何地方,而不是只能在文件顶部.

import的效果从开始延伸到语句块的结束, 这可以大幅减少名称冲突的可能性.

import可以引入多个指定的类, 并可以对引入的类重命名:

scala> import java.awt.{Color, Font}  // import several classes

scala> import java.util.{HashMap => JavaHashMap}  // rename class

import java.util.{HashMap => _, _}  // hide specific class, HashMap has been override by _

最后一个示例中将HashMap重命名为_, 然后该名称被覆盖达到了隐藏某个类的效果。

初识Scala的更多相关文章

  1. 初识Scala反射

    我们知道,scala编译器会将scala代码编译成JVM字节码,编译过程中会擦除scala特有的一些类型信息,在scala-2.10以前,只能在scala中利用java的反射机制,但是通过java反射 ...

  2. Scala小记(一)

    Scala小记----初识Scala 一,什么是Scale? Scala是一门面向对象的,使用JVM运行的函数式编程语言,(函数式编程语言:指的就是那些将方法或者说是函数来作为参数 进行传递的编程语言 ...

  3. Scala语言初识

    scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让 ...

  4. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

  5. 【Spark-core学习之一】 Spark初识

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

  6. Scala中的柯里化

    一.初识Currying柯里化   柯里化(Currying)技术 Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是 Moses Schnfinkel ...

  7. spark源码解析之scala基本语法

    1. scala初识 spark由scala编写,要解析scala,首先要对scala有基本的了解. 1.1 class vs object A class is a blueprint for ob ...

  8. Scala 学习之路(八)—— 类和对象

    一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...

  9. Scala 系列(八)—— 类和对象

    一.初识类和对象 Scala 的类与 Java 的类具有非常多的相似性,示例如下: // 1. 在 scala 中,类不需要用 public 声明,所有的类都具有公共的可见性 class Person ...

随机推荐

  1. assetBundle 中的prefeb资源图片显示粉色方框

    assetBundle打包的资源是有平台属性的,当移动端iOS或者Android AssetBundle资源 在editor 加载的时候,比如TextMeshPro中的字体就不能正确加载 pc端调试, ...

  2. DB2 键约束操作

    DB2 键约束操作 今天遇到一个问题,想要删掉一个表中的某列的唯一约束,google了一下,搜出来许许多多,找到能用的,记下来总结如下. 命令如下 select constname, tabname, ...

  3. 别人的Linux私房菜(9)文件与文件系统的压缩

    www网站利用文件压缩技术进行数据传输,提升网络带宽. 压缩命令gzip与显示zcat.zmore.zless.zgrep -c将压缩的数据显示到屏幕上 -d解压缩 -v显示原文件/压缩文件的压缩比等 ...

  4. idea执行mapreduce报错 Could not locate Hadoop executable: C:\hadoop-3.1.1\bin\winutils.exe

    window执行mapreduce报错 Exception in thread "main" java.lang.RuntimeException: java.io.FileNot ...

  5. ABP框架系列之十四:(Background-Jobs-And-Workers-背景工作和工人)

    Introduction ASP.NET Boilerplate provides background jobs and workers those are used to execute some ...

  6. 7. The British Thached Roof 英国的茅草屋顶

    7. The British Thached Roof 英国的茅草屋顶 (1) The view over a valley of a tiny village with thatchd roof c ...

  7. __LINE__的用法

    简单的说,__LINE__可以获取当前代码的函数,结合__FUNCTION__可以打印调试信息,比如函数出错时运行的函数名,及行号,例如 #define p_err_fun , os_time_get ...

  8. POJ2455 Secret Milking Machine

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12324   Accepted ...

  9. Codeforces791 C. Bear and Different Names

    C. Bear and Different Names time limit per test 1 second memory limit per test 256 megabytes input s ...

  10. eclipse——JDK安装与环境变量配置步骤

    第一次接触eclipse的时候,让我自己安装jdk和配置环境变量,我是懵逼的,后来百度到找到了一个比较详细的引导,本人测试没问题,截图按步骤如下: JDK安装   步骤1: 步骤2: 配置环境变量 步 ...