Scala学习笔记(四) ---- 基本类型和操作与函数式对象
来源:互联网 发布:豆子棋牌挂机软件 编辑:程序博客网 时间:2024/06/06 18:13
一、基本类型与操作
scala的基本类型与java差不多,但两者之间有一些差别,再次就不重点细分来逐个来聊各个基本类型,主要针对scala的不同之处来聊下。
1、首先,我们来看一下下面这张表格,展示的是scala的一些基本类型:
在上面表格中,String是java.lang的类型,其他的是scala的成员类型,这点要注意。
基本类型与java的类似,就不详细介绍了,下面来聊一聊操作符与方法:
2、操作符和方法
2.1、indexOf方法:
String提供了两种重载的indexOf方法,分别是带一个参数的和带两个参数的,通过例子来看下:
//带一个参数的indexOfscala> val str = "Hello,World!"str: java.lang.String = Hello,World!scala> str indexOf '0'res0: Int = 4//带两个参数的indexOfscala> str indexOf ('o', 5)res1: Int = 7
上面例子中,两种indexOf重载的方法,一个参数的与java中的一样,带两个参数的其中第二个参数的意思是从字符串str的第5号索引位置开始往后查找对应的‘o’字符。
3、scala的 "==" 与 java的 "==" 的差别,首先看例子再说明问题:
scala> "he"+"llo" == "hello"res2: Boolean = true//java 原始类型比较代码片段String str1 = "hello";String str2 = "he" + "llo";System.out.println(str1 == str2);//输出结果true
从上面的类型中,可以看到scala 的== 比较结果与java的原始类型比较的结果相同,对java来说"=="除了原始类型的比较,可以以对参数类型的比较,也就是比较两个变量是否都指向JVM堆里的同一个对象。而这种机制在scala中是通过eq (不相等为 ne)来实现的。
二、函数式对象
1、类参数:在定义类时,类名后面括号内的参数就称为类参数。如下例:
class Rational(n:Int, d:Int) { println("Created " +n + "/" + d)}
上面列子中,类名Rational括号内参数n和d为类参数。
2、重载方法定义,如下:
class Rational(n:Int,d:Int) { override def toString = n + "/" + d}
scala的函数式对象类定义中方法重载是通过关键字override来定义,这和java中@override也一样,就不在过多熬述了。
3、类字段定义,scala在类中定义的方法不能直接通过that.x等来使用类参数,因为方法只能访问这些类参数的值,如果要在定义的方法中使用这些类参数,可以通过字段来使用。下面还是通过一个例子还说明问题:
class Rational(n:Int,d:Int) { require(d != 0) //这个require条件是要求d不能等于0,否则的话就会报错,并不往下执行。 override def toString = n + "/" + d def add(that: Rational): Rational = new Rational(n * that.d + that.n*d, d*that*d)}//编译,报如下错<console>:11: error: value d is not a member of Rational new Rational(n * that.d + that.n * d, d * that.d)
尽管类参数n和d都在你的add代码可引用的范围内,但是在调用add的对象中仅能访问他们的值,因而不能够通过that.n或that.d来使用,因为that并不指向被调用的Rational对象。如果想要访问that的n和d,可以通过定义字段来实现。
定义字段,实现代码:
class Rational(n:Int,d:Int) { require(d != 0) val number: Int = n val denom: Int = d override def toString = number + "/" + denom def add(that: Rational): Rational = new Rational( number * that.denom + that.number * denom, denom * that.denom )}
上面代码,将类参数复制给了字段,然后在类方法中通过使用字段的值就可以实现上面的问题了。
4、从构造器,scala与java一样,可以定义多个构造器,但scala的构造器有它的特点。scala中除除主构造器之外的构造器都称为从构造器,而且这里要特别说明的是,从构造器的第一个动作就是调用同一类的其他构造器,并且是调用位于该构造器定义之前的主构造器或从构造器,所以scala的构造器调用最终都是要调用主构造器。
class Rational(n:Int, d:Int) { require(d != 0) val number : Int = n val denom : Int = d def this(n: Int) = this(n, 1) //定义从构造器,并且第一个动作就是调用主构造器this(n, 1) override def toString = n + "/" + d}
5、定义操作符,在上面我们有定义add方法,在调用时,我们可能是如:x add y 这样来调用,这可能与我们平常习惯的不一样,考虑到scala是支持'+','-','*','/'等作为方法名的,那么我们可以将上面定义的方法名改成+,在调用方法时,就直接使用如:x + y 这样来调用。
- Scala学习笔记(四) ---- 基本类型和操作与函数式对象
- Scala基本类型与操作(三)
- python学习笔记(一)--基本操作和基本类型
- Scala中的基本类型 与操作符
- Scala School 笔记(四)--类型和多态基础
- scala学习笔记(四)
- Scala 学习笔记(四)------定义递归函数
- c++ Premier 学习笔记(unit2 变量和基本类型-对象与初始化
- scala函数基本操作
- Scala学习笔记 --- 理解术语面向对象编程和函数式编程
- scala学习笔记(四) 映射与元组
- scala学习笔记(四)样本类与模式匹配
- Scala的数据类型、对象、控制结构、函数和闭包---Scala学习笔记(2)
- TypeScript学习笔记(四)——对象、数组、函数类型
- Scala学习笔记--隐式类型和隐式转换
- Scala学习笔记(三)scala的函数式编程
- scala学习笔记(三)Scala函数式编程
- scala中的函数、变量、集合、对象---scala学习笔记(1)
- iOS 字体的加粗和其他样式的效果
- Make
- 【Win32笔记一】Windows程式关键字
- fragment的生命周期,你需了解的一切
- Dubbo和Spring Cloud
- Scala学习笔记(四) ---- 基本类型和操作与函数式对象
- 数据库的运维策略脚本篇SQL SERVER(内附脚本,无私分享)
- 修改.bashrc文件
- gulp前端自动化构建工具(二):gulp插件/gulp模块介绍
- MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- Salt-API安装配置及使用
- 单点登录思路
- JSP实现在线考试与成绩评测
- 将bmp图片转换成mif文件