scala 小结(一)

时间:2021-08-21 01:28:07

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 学习笔记&lpar;05&rpar; 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可变参数 &amp&semi; Python可变参数 &amp&semi; Scala可变参数

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

  7. akka actor中的基本概念&lpar;学习小结&rpar;

    注:本文章是看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. 真机调试出现Could not find Developer Disk Image问题解决办法

    1.升级Xcode 2. 在使用Xcode进行真机调试的时候,有时根据真机的系统不同,会出现could not find developer disk image 错误,这是由于真机系统过高或者过低, ...

  2. Jordan Lecture Note-12&colon; Kernel典型相关分析&lpar;Kernel Canonical Correlation Analysis&comma; KCCA&rpar;&period;

    Kernel典型相关分析 (一)KCCA 同样,我们可以引入Kernel函数,通过非线性的坐标变换达到之前CCA所寻求的目标.首先,假设映射$\Phi_X: x\rightarrow \Phi_X(x ...

  3. NoSql 数据库

    几款主流 NoSql 数据库的对比 posted @ 2016-05-11 21:36 vajoy 阅读(915) 评论(3) 编辑 收藏   最近小组准备启动一个 node 开源项目,从前端亲和力. ...

  4. jQuery的get&lpar;&rpar;post&lpar;&rpar;getJson&lpar;&rpar;方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...

  5. Centos7使用kubeadm部署kubernetes-1&period;11&period;2

    1.安装方式 1.  传统方式,以下组件全部运行在系统层面(yum或者rpm包),都为系统级守护进程 2.  kubeadm方式,master和node上的组件全部运行为pod容器,k8s也为pod ...

  6. java----OO的概念和设计原则(转)

    一.OO(面向对象)的设计基础 面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性, 来认识.理解.刻划客观世界和设计.构建相应的软件系统.面向对象的 ...

  7. ionic app开发遇到的问题

    :processDebugResources FAILED FAILURE: Build failed with an exception. * What went wrong: Execution ...

  8. Android平台上最好的几款免费的代码编辑器

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  9. css overflow和float

    float:使元素向左或向右移动(不能上下移动),直到它的外边缘碰到包含框或另一个浮动框的边框为止,浮动元素之前的元素将不会受到影响,之后的元素将围绕它. float之后的元素脱离文档流. 默认为no ...

  10. 查看历史命令 history

    生产上有文件被清空了,想查查是谁操作的? 通过history查看历史命令: $history |more 也可以通过文件查看历史命令: $vi ~/.bash_history 只显示历史命令,像查一查 ...