Scala学习(一)--Scala基础学习
Scala基础学习 |
摘要:
在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作。在这个过程中,我们将介绍一系列重要的Scala概念和惯用法。同时你还将学到作为初学者如何浏览Scaladoc文档
1. 使用Scala解释器
2. 用var和val定义变量
3. 数值类型
4. 使用操作符和函数
5. 浏览Scaladoc
Scala解释器 |
启动Scala解释器的步骤如下:
安装Scala
确保scala/bin目录位于系统PATH中
在你的操作系统中打开命令行窗口,键入scala并按Enter键
现在键人命令,然后按Enter键。每一次,解释器都会显示出结果。例如,当你键人"8*5+2"(如下面加粗的文字),将得到42:
答案被命名为res0,你可以在后续操作中使用这个名称:
正如你所看到的,解释器同时还会显示结果的类型,拿本例来说就是Int、Double和java.lang.String
还可以调用方法,根据启动解释器的方式的不同,你可能可以使用Tab键补全而不用完整地手工键人方法名。你可以试着键人res2.to,然后按Tab键,如果解释器给出了如下选项:
说明Tab键补全功能是好的。接下来键入U并再次按Tab键,你应该就能定位到单条补全如下:
同样地,可以试试按T和J方向键。在大多数实现当中,你将看到之前提交过的命令,并且可以进行编辑。用方向键和Del键将上一条命令修改为:
正如你所看到的,Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。这个过程被称做读取一求值一打印一循环,即REPL。从技术上讲,scala程序并不是一个解释器。实际发生的是,你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。正因如此,大多数Scala程序员更倾向于将它称做"REPL"。
声明值和变量 |
声明值:
除了直接使用res0、res1等这些名称之外,你也可以用val定义自己的名称:
以val定义的值实际上是一个常量,你无法改变它的内容:
声明变量:
如果要声明其值可变的变量,可以用var定义其值可变的变量:
需要注意的是,不需要给出值或者变量的类型,这个信息可以从你用来初始化它的表达式推断出来。但还需注意一点,声明值或变量但不做初始化会报错。不过,在必要的时候,你也可以指定类型。例如:
由上图运行的结果可知,在Scala中,变量或函数的类型总是写在变量或函数名称的后面。这使得我们更容易阅读那些复杂类型的声明。同时还需注意的是,在变量声明或赋值语句之后,我们并没有使用分号。在Scala中,仅当同一行代码中存在多条语句时才需要用分号隔开。
常用类型 |
基本数据类型:
到目前为止你已经看到过Scala数据类型中的一些,比如Int和Double,和Java样Scala也有7种数值类型:Byte、Char、Short、Int、Long、Float和Double,以及1个Boolean类型。跟Java不同的是,这些类型是类。Scala并不刻意区分基本类型和引用类型。你可以对数字执行方法,例如:
scala> 1.toString
res6: String = 1
或者,更有意思的是,你可以:
scala> 1.to(10)
res7: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8,9, 10)
在Scala中,我们不需要包装类型。在基本类型和包装类型之间的转换是Scala编译器的工作。举例来说,如果你创建一个Int的数组,最终在虚拟机中得到的是一个int[]数组。
基本数据类型转换:
正如你在前面看到的那样,Scala用底层的java.lang.String类来表示字符串。不过,它通过StringOps类给字符串追加了上百种操作。举例来说,intersect方法输出两个字符串共通的一组字符:
scala> "Hello".intersect("World")
res8: String = lo
在这个表达式中java.lang.String对象"Hello"被隐式地转换成了一个StringOps对象,接着StringOps类的intersect方法被应用。因此,在使用Scala文档的时候,记得要看一下StringOps类。同样地,Scala还提供了Richlnt、RichDouble、RichChar等。它们分别提供了它们可怜的堂兄弟们Int、Double、Char等,所不具备的便捷方法。我们前面用到的to方法事实上就是Richlnt类中的方法。在表达式:1.to (10)中,Int值1首先被转换成Richlnt然后再应用to方法。
最后,还有Biglnt和BigDecimal类,用于任意大小(但有穷)的数字。这些类背后分别对应的是java.math.Biglnteger和java.math.BigDecimal
注意:在Scala中,我们用方法,而不是强制类型转换,来做数值类型之间的转换。举例来说,99.44.tolnt得到99,99.toChar得到'c'。当然和Java一样,toString将任意的对象转换成字符串。要将包含了数字的字符串转换成数值,使用tolnt或toDouble。例如,"99.44".toDouble得到99.44。
算术和操作符重载 |
Scala的算术操作符和你在Java或C++中预期的效果是一样的:
val answer=8*5+2
算术操作符:+ -*/%等操作符完成的是它们通常的工作,位操作符:&|^ >><<也一样。只有一点特别的,这些操作符实际上是方法。例如:
a+b
是如下方法调用的简写:
a.+(b)
这里的+是方法名。通常来说,你可以用:
a方法b
作为以下代码的简写:
a.方法(b)
这里的方法是一个带有两个参数的方法(一个隐式的和一个显式的)。例如
1.to (10)
可以写成:
1 to10
调用函数方法 |
除了方法之外,Scala还提供函数。相比Java,在Scala中使用数学函数更为简单,你不需要从某个类调用它的静态方法
scala> import scala.math._
import scala.math._
scala> sqrt(2)
res15: Double = 1.4142135623730951
scala> pow(2,4)
res16: Double = 16.0
scala> min(3,Pi)
res18: Double = 3.0
这些数学函数是在scala.math包中定义的。你可以用如下语句进行引入:
import scala.math._//在Scala中,_字符是"通配符",类似Java中的*字符
Scala没有静态方法,不过它有个类似的特性,叫做单例对象singleton object。通常,一个类对应有一个伴生对象companion object,其方法就跟Java中的静态方法一样
apply方法 |
在Scala中,我们通常都会使用类似函数调用的语法。举例来说,如果S是一个字符串,那么S(i)就是该字符串的第i个字符。在C++中,你会写:S[i];而在Java中,你会这样写:S.charAt(i)。在REPL中运行如下代码:
scala> "Hello"(4)
res19: Char = o
scala> "Hello"(0)
res20: Char = H
scala>
你可以把这种用法当做是()操作符的重载形式,它背后的实现原理是一个名为apply的方法。举例来说,在StringOps类的文档中,你会发现这样一个方法:
def apply(n: Int): Char
也就是说,"Hello"(4)是如下语句的简写:
"Hello".apply(4)
如果你去看Biglnt伴生对象的文档,就会看到让你将字符串或数字转换为Biglnt对象的apply方法。举例来说,如下调用
Biglnt ("1234567890")
是如下语句的简写:
Biglnt.apply("1234567890")
这个语句产出一个新的Biglnt对象,不需要使用new。例如:
Biglnt("1234567890") *Biglnt("112358111321")
像这样使用伴生对象的apply方法是Scala中构建对象的常用手法。例如,Array(l,4,9,16)返回一个数组,用的就是Array伴生对象的apply方法
Scaladoc |
Java程序员们使用Javadoc来浏览Java AP,Scala也有它自己的版本,叫做Scaladoc。相比Javadoc,浏览Scaladoc更具挑战性。Scala类通常比Java类拥有多得多的便捷方
法。有些方法使用了你还没学到的特性。而且,有些特性展示出来的是它们的实现细节而并不是使用指南。我们可以在www.scala-lang.org/api在线浏览Scaladoc,不过也可以从www.scala-lang.org/downloads#api下载一个副本安装到本地。
和Javadoc按照字母顺序列出类清单不同,Scaladoc的类清单按照包排序。如果你知道类名但不知道包名,可以用左上角的过滤器,参照下图:
点击×号可以清空过滤器。注意每个类名旁边的O和C,它们分别链接到对应的类(C)或伴生对象(O)。由于信息量大,Scaladoc可能读起来会比较累人。请记住以下这些小窍门:
■ 如果你想使用数值类型,记得看看Richlnt、RichDouble等。同理,如果想使用字符串,记得看看SpringOps
■ 那些数学函数位于scala.math包中,而不是位于某个类中
■ 有时你会看到名称比较奇怪的函数。比如,Biglnt有一个方法叫做unary_-。这就是你定义前置的负操作符-x的方式
■ 标记为implicit的方法对应的是自动(隐式)转换。比如,Biglnt对象拥有在需要时自动被调用的由int和long转换为Biglnt的方法
■ 方法可以以函数作为参数。例如,StringOps的count方法需要传人一个接受单个Char并返回true或false的函数,用于指定哪些字符应当被清点:
def count(p: (Char)=>Boolean) : Int
调用类似方法时,你通常可以一种非常紧凑的表示法给出函数定义。例如,s.count(_.isUpper)的作用是清点所有大写字母的数量
■ 你时不时地会遇到类似Range或Seq[Char]这样的类。它们的含义和你的直觉告诉你的一样:一个是数字区间,一个是字符序列
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【Sunddenly】。本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Scala学习(一)--Scala基础学习相关推荐
- 医用计算机基础学习心得,计算机基础学习心得.doc
计算机基础学习心得 计算机基础学习心得一:计算机基础学习心得 当今社会,到处充满机会与挑战.知识是我们面对这一切的筹码,而计算机知识则更为重要.如何在本科函授这样一种形式下,学好计算机课程,这是摆在我 ...
- 学习笔记-零基础学习人工智能(0)
学习笔记-零基础学习人工智能(0) 背景 规划 背景 作为物理专业的大龄青年,由于兴趣爱好想学习下人工智能.主要感兴趣的方向是对抗样本生成.自己也做了一些了解,但是发现千头万绪,不懂的东西太多.为了梳 ...
- Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python
Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...
- 全栈学习之CSS基础学习
CSS基础学习 1. CSS导入方式 行内样式 内部样式 外部样式 2. 三种基本选择器 2.1 标签选择器 2.2 类选择器 2.3 id选择器 2.4 关联 3. 层次选择器 3.1 后代选择器 ...
- ①小白学习Linux之基础学习★
Linux基础学习√ 1.centos6和7的变化 1.1.文件系统 1.2.防火墙.内核版本.默认数据库 1.3.时间同步,修改时区,修改语言 1.4.主机名 1.5.网络服务管理 1.6.网络设置 ...
- 素描学习入门零基础学习静物素描的几种方法
在讲之前我们先来简单了解一下静物素描的定义:"静物写生是对形体质感表现的一种形式,主要利用笔触.线条和调子和明暗关系的变化." 比如在画坚硬物体-铁骑.陶瓷.玻璃等的时候,线条要严 ...
- 新人学习笔记-分布式基础学习-分布式文件系统
所谓分布式,在这里,很狭义的指代以Google的三驾马车,GFS.Map/Reduce.BigTable为框架核心的分布式存储和计算系统.通常如我一样初学的人,会以Google这几份经典的论文作为开端 ...
- 深度学习-计算机视觉-0基础-学习历程
周志华<机器学习>------------------------若是想从基础算法公式开始可以先试着看一下周志华的<机器学习>,由于我对公式推导很头疼,看了几页就跳过了.(在经 ...
- 愣头青法学习openstack——零基础学习openstack的建议
由于收到很多人的私信,问我如何高效快速学习openstack,今天在这里就给大家分享一下我的openstack学习心得. 我也是刚入门学习openstack的小黑,所以先写几句话放在前面,应该很合逻辑 ...
- 【中间件学习】Fluentd基础学习教程
文章目录 引言 安装 推荐的安装方式: 其他安装方式的采坑 测试验证 学习过程 1. 先学习一个简单的采集示例: 2. 学习一下fluentd相关的关键字配置. 日志接入实践 总结 引言 Fluent ...
最新文章
- JSP中实现网页访问统计的方法
- [导入]extjs 教程
- CLLocationManager 位置定位
- k8s容器生命周期:指定启动、退出动作
- c语言实现两个有序链表的合并(代码示例)
- 【Set jsonObj = toJson( jsonString )】创建JSON实例
- TensorFlow8-mnist手写数字识别入门
- python创建变量score_关于Python创建类时的self参数和__init__
- RocketMQ(八)——Rebalance机制介绍
- DigitalClock的替代者TextClock
- JavaScript创建与读写本地文件(IEFirefox)
- java9 多版本兼容jar_Java 9 多版本兼容 jar 包
- python中的numpy库有什么优缺点_Python中Numpy库的基础知识点
- 软件测试中的白盒测试的工具,软件测试人员该如何选择白盒测试工具?常用的白盒测试工具汇总...
- 干货培训 | 使用OBS进行直播导播和推流(下篇)
- 百度点击算法核心内容大揭秘
- STM32学习过程一
- NDIS中间层的驱动包截获技术教程
- 浙江计算机专业技术考试大纲,浙江省高校计算机等级考试大纲(三级)
- 移动端实时音视频直播技术详解(一):开篇