Scala 是什么?(What is scala?)

  引用百度百科对于scala的定义:

Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。

  scala 是一种纯面向对象的编程语言,但是与java不同,其还无缝结合了命令式编程以及函数式编程。scala的出现,抹平了这些编程范式之间严格的界限。与java相比,scala更为简洁,实现一个相同的功能,也许scala的代码行数只需要java的五分之一甚至十分之一,这当然与scala和函数式编程的结合密不可分。scala基于JVM平台,这使得其与java可以无缝衔接,目前Apache Spark 等框架在大数据领域占有举足轻重的地位,工业界也已经证明了scala语言的强大。所以scala语言在近些年越来越火热了。

Scala 的安装环境配置

  由于scala基于JVM,所以首先肯定需要安装java的开发环境的,这个网上都有教程。不赘述。其次需要去下载scala的安装包,然后按照教程配置即可。我使用的IDE 是 eclipse for scala,当然使用eclipse + scala 的插件也是可以的。这些网上都有教程,这里不表。

说明: 这里的总结主要基于《Scala开发快速入门》这本书,目前国内关于Scala的中文书籍还不是很多,这本书还不错,想学Scala的同学可以看下。另外还有一些英文的参考书也是不错的。比如:

1.《Scala编程》
2. 《Beginning Scala》
3. 《Programming in Scala》
4. 《Scala CookBook》
5. 《Scala in Action》
6. 《Scala in Depth》
7. 《Steps in Scala》https://www.google.com.hk/?gws_rd=ssl

  我把上面这些书的电子版打包到百度云了, 有需要的自取。地址为:

Scala的Hello World

写一个文件名叫 HelloWorld.scala,里面的代码如下

object HelloWorld extends App{
println("Hello World!")
}

输入结果为 Hello World!

1. Scala变量和基本数据类型

  1.1 scala中有两种数据类型,一种是可变变量,一种是不可变变量。可变变量使用 var 声明,不可变变量使用 val 声明。不可变变量一旦被赋值之后,在程序运行过程中不可以更改。下面展示了var 与 val 的使用方式。

scala>var string = "HelloWorld"
string:String = HelloWorld scala>string = "How are you?"
string:String = How are you? scala>val newString = "hello"
newString:String = hello scala> newString = "HELLO"
<console>:12: error: reassignment to val
newString = "HELLO"

可以看出,声明为 val 的变量在赋值之后,如果被重新赋值,则会报错。

  1.2 需要注意的是,scala中的变量在定义时必须被初始化,否则会报错。比如:

scala> var string:String
<console>:11: error: only classes can have declared but undefined members
(Note that variables need to be initialized to be defined)
var string:String scala> val string:String
<console>:11: error: only classes can have declared but undefined members
val string:String scala> val string:String = ""
string: String = ""

   1.3 使用占位符 _ 初始化。

在对变量进行初始化时,有一种特殊的初始化方式,即使用占位符 _ 初始化。String 类型使用 _ 初始化为 null,Float ,Int,Double使用 _ 初始化为0,Char 则被初始化为 ?。例子如下:

scala> var s:String = _
s: String = null scala> var i:Int = _
i: Int = 0 scala> var f:Float = _
f: Float = 0.0 scala> var double:Double = _
double: Double = 0.0 scala> var ch:Char = _
ch: Char = ?

   1.4 使用lazy 关键字。在scala中,使用lazy 关键字修饰 val 变量只有在变量真正使用的时候才会被赋值。举例如下:

scala> lazy val s1 = "string"
s1: String = <lazy> scala> s1
res0: String = string

需要注意的是:lazy 关键字不能修饰 var 变量,这样做的目的是为了防止变量在被使用之前就被重新赋值。

scala> lazy var s2 = "string"
<console>:1: error: lazy not allowed here. Only vals can be lazy
lazy var s2 = "string"
^

   1.5 scala 的基本数据类型。scala 中的基本数据类型有 Byte、Short、Int、Long、Char、String、Float、Double、Boolean 九种。这与java中的基本数据类型是一一对应的,只不过scala中的基本数据类型首字母要大写,这是因为scala中所有的值类型都是对象。

  • Byte Byte 为8位有符号的整数,表示的范围是:\(-2^{7}\) 到 \(2^{7}-1\)。
  • Short Short 为 16位有符号的整数,表示的范围是 \(-2^{15}\) 到 \(2^{15}-1\)。
  • Int Int 为 32位有符号的整数,表示的范围是 \(-2^{31}\)到 \(2^{31}-1\)。Int 类型变量的定义方式包括十进制、八进制和十六进制三种。

    十进制是最常用的定义Int 类型变量的方式:
scala> var a = 12
a: Int = 12

八进制使用数字0开头定义:

var b = 012
b:Int = 10

十六进制使用 0x 开头定义:

var c = 0x12
c:Int = 18
  • Float 由于 scala 具有类型推导的功能,所以对于浮点数如果不明确指明,scala 会自动将它翻译为Double 类型的。如果想要声明一个Float类型,需要在浮点数后面加F或者f。比如3.13f。
scala> var f = 3.13
f: Double = 3.13
scala> var f = 3.13f
f: Float = 3.13
  • Double Double 表示的是双精度的浮点数。scala中的浮点数默认就是Double类型的。Double 还可以使用指数表示法,在浮点数后面加e或者E,比如1.2e2。
scala> var double = 3.1415
double: Double = 3.1415
scala> var e = 1.2e2
e: Double = 120.0
  • Char Char 表示的是字符类型,使用单引号将一个字符括起来。部分特殊字符需要使用\进行转义。
scala> var ch = 'c'
ch: Char = c
scala> var ch = '\"'
ch: Char = "
scala> var ch = '\141'
warning: there was one deprecation warning; re-run with -deprecation for details
ch: Char = a
  • String String 类型表示的是字符串类型。使用双引号将字符串括起来即可。如果字符串中有特殊字符(比如双引号)需要进行转义。
scala> var str = "string"
str: String = string
scala> var str = "What's your name?"
str: String = What's your name?
scala> var str = "My name is \"lyrichu\"."
str: String = My name is "lyrichu".

scala中还提供了一种特殊的可以保证原样输出的记号,"""(三个双引号)。比如:

scala> var str = """hello,\n\n what's your name? ""\n"""
str: String = hello,\n\n what's your name? ""\n
  • Boolean Boolean 表示的是布尔类型。有true和false两种。
scala> var x = true
x: Boolean = true
scala> var y = false
y: Boolean = false

2. scala 基本类型操作

   2.1 算术运算操作。基本的算数运算操作有加(+)、减(-)、乘(*)、除(/)、取余(%)。举例如下:

scala> 1 + 1
res2: Int = 2
scala> 1-10
res3: Int = -9
scala> 8*9
res4: Int = 72
scala> 1/2
res5: Int = 0
scala> 100 % 3
res6: Int = 1
scala> 1f*12
res7: Float = 12.0
scala> 2 + -3
res8: Int = -1

注意上面 res8的结果,scala中提供了 + 和 - 两个操作符,可以直接在运算中使用。

  2.2 关系运算操作 scala中的关系运算操作符包括 大于(>)、小于(<)、小于等于(<=)、大于等于(>=),使用实例如下:

scala> 1<2
res9: Boolean = true
scala> -1>3
res10: Boolean = false
scala> 2>=2
res11: Boolean = true
scala> 3<=3
res12: Boolean = true
scala> !(1>2)
res13: Boolean = true

上式中 ! 为取反操作符。

  2.3 逻辑运算操作符。scala中的逻辑运算操作符包括逻辑与(&&)和逻辑或(||)操作符。逻辑与运算符当两个条件都为真时才为真,逻辑或只要至少有一个为真就为真。举例如下:

scala> var b1 = 1<2
b1: Boolean = true
scala> var b2 = 2>3
b2: Boolean = false
scala> b1 && b2
res14: Boolean = false
scala> b1 || b2
res15: Boolean = true

  2.4 位运算操作符 scala中的位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~),左移位(<<)、右移位(>>)、无符号左移位(<<<)、无符号右移位(>>>)。按位与只有当某一位两个数都为1时才为1,否则为0;按位或只要至少有一个1就为1;按位异或当一个0一个1时为1,否则为0;按位取反将原本的1变为0,0变为1;左移位将所有位的数字左移,左移一位相当于原数字乘以2;右移位将所有的数字右移,右移一位相当于原来的数字除以2;无符号左移,是将所有位数字左移,低位补0,高位舍弃;无符号右移,是将各位所有数字右移,高位补0,低位舍弃。实例如下

scala> 3&5 // 3->00000011,5->00000101, 3&5 -> 00000001
res16: Int = 1
scala> 3|5 // 3->00000011,5->00000101, 3|5 -> 00000111
res17: Int = 7
scala> 3^5 // 3->00000011,5->00000101,3^5 -> 00000110
res18: Int = 6
scala> ~3 // 3->00000011 ~3 -> 11111100->-4
res19: Int = -4
scala> 3>>2
res20: Int = 0
scala> 3<<2
res21: Int = 12
scala> -1>>>31
res22: Int = 1

   2.5 对象比较运算符。 这里需要注意的是,在java中的对象比较是基于引用的,即比较两个对象实际的物理地址是否一样,而scala是基于内容比较的,不管两个对象地址是否一样。

scala> 1.0==1
res26: Boolean = true
scala> var x = "string"
x: String = string
scala> var y = "string"
y: String = string
scala> x==y
res27: Boolean = true
scala> y.equals(x)
res28: Boolean = true
scala> var z = new String("string")
z: String = string
scala> z == x
res29: Boolean = true
scala> z.eq(x)
res30: Boolean = false

注意如果要是想比较两个对象的引用是否一样,需要调用对象的eq方法。

   2.6 字符串运算操作 scala 中的String 类型实际上就是 java中的 java.lang.String 类型,因此是可以调用java中的所有String类的方法。举例如下:

scala> str.indexOf("e")  // 找到e的索引
res31: Int = 1
scala> str.toUpperCase() // 把所有字符变大写
res32: String = HELLO
scala> str.reverse // 翻转字符串
res34: String = olleh
scala> str.toLowerCase // 变小写
res35: String = hello
scala> str.drop(3) // 丢弃前3前位字符
res36: String = lo
scala> str.slice(1,4) // 取第1到第3位的字符(从0开始)
res37: String = ell

  2.7 元组类型。scala中元组是一种特殊的类型,可以将不同类型的值放在一个变量中保存。元组的定义如下:

scala> var tuple = ("hello","world",1.0)
tuple: (String, String, Double) = (hello,world,1.0)

在使用的时候还可以将元组的内容提取,对多个变量进行初始化,比如:

scala> val (first,second,third) = tuple
first: String = hello
second: String = world
third: Double = 1.0

上面的代码将元组tuple中的三个元素分别赋值给了first、second、third变量。如果要想访问元组中的内容,可以使用 tuple变量._N的形式来进行,其中N表示元组元素的索引号(从1开始计数)。比如下面的代码:

scala> tuple._1
res0: String = hello scala> tuple._2
res1: String = world scala> tuple._3
res2: Double = 1.0

   2.8 符号类型。scala中还有一种特殊的类型为符号类型(Symbol),使用 ' 符号进行标识。举例如下:

scala> val s = 'hello
s: Symbol = 'hello scala> val s1:Symbol = 'world
s1: Symbol = 'world

符号类型在输出时会原样输出(带有'符号)

scala> println(s)
'hello

符号类型主要起标识作用,在模式匹配和内容判断中比较常见,比如:

scala> if(s == 'hello) println("hello") else println("others")
hello

与String等类型一样,scala在使用 == 符号进行比较时,比较的是变量的内容而不是引用。比如:

scala> val s2 = 'hello
s2: Symbol = 'hello scala> s2 == s1
res5: Boolean = false scala> s2 == s
res6: Boolean = true

scala 小结(一)的更多相关文章

  1. Scala数组小结

    1.定长数组 定长数组:指长度不可变的数组Array. 第一种方式: 先声明一个数组,后初始化该数组: scala> val array = new Array[Double](5) array ...

  2. Scala HandBook

    目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6 ...

  3. scala 学习笔记(05) OOP(中)灵活的trait

    trait -- 不仅仅只是接口! 接上回继续,scala是一个非常有想法的语言,从接口的设计上就可以发现它的与众不同.scala中与java的接口最接近的概念是trait,见下面的代码: packa ...

  4. Scala 深入浅出实战经典 第66讲:Scala并发编程实战初体验

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  6. Java可变参数 & Python可变参数 & Scala可变参数

    Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...

  7. akka actor中的基本概念(学习小结)

    注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...

  8. 为Play初学者准备的Scala基础知识

    1 前言 本文的主要目的是为了让Play Framework的初学者快速了解Scala语言,算是一篇Play Framework的入门前传吧.使用PlayFramework可以极大的提高开发效率,但是 ...

  9. Scala基础 - 下划线使用指南

    下划线这个符号几乎贯穿了任何一本Scala编程书籍,并且在不同的场景下具有不同的含义,绕晕了不少初学者.正因如此,下划线这个特殊符号无形中增加Scala的入门难度.本文希望帮助初学者踏平这个小山坡. ...

随机推荐

  1. keepalived配置文件详解(2)

    全局配置 global_defs { notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个邮件地址 xuequn@.com } noti ...

  2. git删除本地分支

    远端master分支有更新需要拉取至本地,但是代码有些地方做了修改导致了小冲突,但是这些修改又是无关紧要的,于是就打算直接删除掉本地分支再重新拉取master分支,过程如下: //查看本地分支 git ...

  3. 【JavaScript的引入方式】

    javascript:   是基于对象和事件驱动的客户端脚本[组成] Bom:浏览对象模型(与浏览器交互的方法和接口) Dom:文档对象模型(处理网页内容的方法和接口) ecma:核心(描述了js的语 ...

  4. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】

    2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2010  Solved: 1260[Submit][Statu ...

  5. HDU2988-Dark roads,HDU1233-还是畅通工程-最小生成树

    最小生成树: 中文名 最小生成树 外文名 Minimum Spanning Tree,MST 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的 ...

  6. Bellman-Ford 求含负权最短路

    该算法详解请看   https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 单源最短路   当图中存在负权边时 迪杰斯特拉就 ...

  7. DFS+打表

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. A. Duff and Meat

    A. Duff and Meat time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. 一些有用的stl知识《acm程序设计》

    accepted           通过 Presentation  Error   输出格式错误 Wrong Answer  答案错误 Runtime Error   多为数组访问越界 程序运行时 ...

  10. python笔记二(mysql数据库操作)

    python2.x使用MySQLdb python3.x使用pymysql代替MySQLdb 不过我使用的是python3.5,MySQLdb还是可以在python3.5使用的. #!/usr/bin ...