初识Scala
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 到 127Short
: 16位有符号补码整数。数值区间为 -32768 到 32767Int
:32位有符号补码整数。数值区间为 -2147483648 到 2147483647Long
: 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807Float
: 32位IEEE754单精度浮点数Double
: 64位IEEE754单精度浮点数Char
: 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFFString
: 字符序列Boolean
: true或false
scala中还有一些特殊的类型:
Null
: null 或空引用Nothing
: 任何其他类型的子类型。Any
: 所有其他类的超类AnyRef
: 所有引用类(reference class)的基类
scala定义了一些字面量的语法:
整型字面量: 默认为Int类型, 加
L
或l
后缀为Long类型, 支持10进制和16进制写法,8进制写法已被废弃.
示例:123
,0xFF
,123L
浮点字面量: 默认为Double类型, 加
F
或f
后缀为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的更多相关文章
- 初识Scala反射
我们知道,scala编译器会将scala代码编译成JVM字节码,编译过程中会擦除scala特有的一些类型信息,在scala-2.10以前,只能在scala中利用java的反射机制,但是通过java反射 ...
- Scala小记(一)
Scala小记----初识Scala 一,什么是Scale? Scala是一门面向对象的,使用JVM运行的函数式编程语言,(函数式编程语言:指的就是那些将方法或者说是函数来作为参数 进行传递的编程语言 ...
- Scala语言初识
scala是一种集面向对象特性和函数式特性于一身并可运行在JVM上的强类型静态语言.因为可以运行在JVM上,并在设计时借鉴于大量的java语言特性,故可以和java互动并可以调用java相关类库,这让 ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
- 【Spark-core学习之一】 Spark初识
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Scala中的柯里化
一.初识Currying柯里化 柯里化(Currying)技术 Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是 Moses Schnfinkel ...
- spark源码解析之scala基本语法
1. scala初识 spark由scala编写,要解析scala,首先要对scala有基本的了解. 1.1 class vs object A class is a blueprint for ob ...
- Scala 学习之路(八)—— 类和对象
一.初识类和对象 Scala的类与Java的类具有非常多的相似性,示例如下: // 1. 在scala中,类不需要用public声明,所有的类都具有公共的可见性 class Person { // 2 ...
- Scala 系列(八)—— 类和对象
一.初识类和对象 Scala 的类与 Java 的类具有非常多的相似性,示例如下: // 1. 在 scala 中,类不需要用 public 声明,所有的类都具有公共的可见性 class Person ...
随机推荐
- json字符转对象之new Function('return ' + str)
var jsonStr = '{"id":1,"name":"linda","hobbies":[{"id&q ...
- js--sort()排序方法的使用--(笔记)
情况1: var arr = [ 'c', 'd', 'a', 'e' ]; //都是字母的情况arr.sort();//alert( arr ); ...
- Linux学习--- 宏定义下#、##的使用
# 字符串化 ## 连接符号 eg: #include <stdio.h> #define ABC(x) #x #define DAY(c) myday##c int main (){ ...
- QT中报错collect2:ld returned 1 exit status的可能原因。
参考:https://blog.csdn.net/u014546553/article/details/78781547 1.编译成功的例子在后台执行,有时一闪而过,如果再次build ,则会提示上述 ...
- openstack之cinder_backup对接ceph存储
M版openstack,是kolla部署的 1.介绍 backup 功能好像与 snapshot 很相似,都可以保存 volume 的当前状态,以备以后恢复.但二者在用途和实现上还是有区别的,具体表现 ...
- mongoDB实现MapReduce
一.MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).MongoDB提供的Ma ...
- freeRTOSConfig.h文件对FreeRTOS进行系统配置
FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制.每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核.这个配置文件是针 ...
- C++语言学习
1.< >表示包含那些由系统提供的并放在指定子目录中的头文件,对于自己编写的头文件放在当前目录或其他目录下则用双引号” ”; 2.复合类型的声明: int* p1,p2;//p1是指向in ...
- 一些有价值的Blog推荐
待看的一些文章 1. 性能调优攻略 http://coolshell.cn/articles/7490.html 2. 内存的存储管理--段式和页式管理的区别 http://blog.sina.com ...
- zookeeper日志级别
查看源代码得知zookeeper(版本3.4.13)内部的日志用的slf4j,项目启动zk连接了之后一直在打debug日志(如下所示),甚是讨厌,logback日志级别调成info没用. 17:24: ...