Scala实践9
1、特征
Traits用于在类之间共享接口和字段。它们类似于Java 8的接口。类和对象可以扩展特征,但是特征不能被实例化,因此没有参数。
- 定义一个特征
最小特征只是关键字trait
和标识符:
trait Color
特征作为泛型类型和抽象方法特别有用。
trait Iterator[A] {
def hasNext: Boolean
def next(): A
}
扩展(与Java中的实现类似)trait Iterator[A]
需要一个类型A
和方法实现hasNext
和next
。
- 使用特征
使用extends
关键字来扩展特征。然后使用override
关键字实现特征的任何抽象成员:
trait Iterator[A] {
def hasNext: Boolean
def next(): A
} class IntIterator(to: Int) extends Iterator[Int] {
private var current = 0
override def hasNext: Boolean = current < to
override def next(): Int = {
if (hasNext) {
val t = current
current += 1
t
} else 0
}
} val iterator = new IntIterator(10)
iterator.next() //returns 0
iterator.next() //returns 1
此类IntIterator
将参数to
作为上限。这extends Iterator[Int]
意味着该next
方法必须返回一个Int。
- 分型
在需要给定特征的情况下,可以使用特征的子类型。
import scala.collection.mutable.ArrayBuffer trait Pet {
val name: String
} class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet val dog = new Dog(name="Harry")
val cat = new Cat(name="Sally") val animals = ArrayBuffer.empty[Pet]
animals.append(dog)
animals.append(cat)
animals.foreach(pet => println(pet.name))
trait Pet
有一个抽象字段name
,由Cat和Dog在其构造函数中实现。在最后一行,我们调用pet.name
哪个必须在特征的任何子类型中实现Pet
。
2、正则表达式
正则表达式是可用于在数据中查找模式(或缺少模式)的字符串。可以使用该.r
方法将任何字符串转换为正则表达式。
import scala.util.matching.Regex val numberPattern: Regex = "[0-9]".r numberPattern.findFirstMatchIn("awesomepassword11") match {
case Some(_) => println("Password OK")
case None => println("Password must contain a number")
}
结果如下:
在上面的例子中,numberPattern
是一个Regex
(正则表达式),用它来确保密码包含一个数字。
3、提取器对象
提取器对象是具有unapply方法 的对象,虽然apply方法就像一个构造函数,接受参数并创建一个对象,但是unapply接受一个参数并试图回馈参数,通常用于模式匹配和部分功能。
import scala.util.Random object CustomerID {
def apply(name:String) = s"$name--${Random.nextLong}" def unapply( customerID:String): Option[String] ={
val stringArray:Array[String]=customerID.split("--")
if(stringArray.tail.nonEmpty) Some(stringArray.head) else None
}
def main(args: Array[String]): Unit = {
val customer1ID = CustomerID("harry--aaaaaa--jurry")
customer1ID match {
case CustomerID(name) => println(name)
case _ => println("Could not extract a CustomerID")
}
}
}
该apply
方法CustomerID
从创建一个字符串name,
unapply
做反拿到name
回来。当我们调用时CustomerID("
harry--aaaaaa--jurry")
,这是调用的简写语法CustomerID.apply("harry--aaaaaa--jurry")
。当我们打电话时case CustomerID(name) => println(name)
,我们正在调用unapply方法。
Scala实践9的更多相关文章
- Scala实践14
1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...
- Scala实践13
1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...
- Scala实践12
1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...
- Scala实践11
1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...
- Scala实践10
1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...
- Scala实践6
1 if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...
- Scala实践8
1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...
- Scala实践7
一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...
- Scala实践5
一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...
随机推荐
- Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" Eclipse Maven报错
eclipse 项目中报错Lifecycle mapping "org.eclipse.m2e.jdt.JarLifecycleMapping" is not available, ...
- Github开源人脸识别项目face_recognition
Github开源人脸识别项目face_recognition 原文:https://www.jianshu.com/p/0b37452be63e 译者注: 本项目face_recognition是一个 ...
- document.getElementById()
使用两个for循环取json数据的时候出错: 代码简化如下: for(var a=0;a<3;a++){ for(var b=0;b<3;b++){ document.getElement ...
- P1075 语句解析
题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:=[变量或一位整数]; ...
- JAXB常用注解讲解(超详细)
简介: JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例 ...
- H3C 使用tracert命令
- Linux 内核 中断 urb
函数 usb_fill_int_urb 是一个帮忙函数, 来正确初始化一个 urb 来发送给 USB 设备的 一个中断端点: void usb_fill_int_urb(struct urb *urb ...
- JRoll 2 适用于移动开发滚动(滑动)——轻量级插件
JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. 官网:http://www.c ...
- 【2016常州一中夏令营Day7】
序列(sequence)[题目描述]蛤布斯有一个序列,初始为空.它依次将 1-n 插入序列,其中 i插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边).它希望你帮它求出最终序列.[输入数据 ...
- neo4j-查询示例
查找名为"Cloud Atlas"的电影 match(cloudAtlas {title:"Cloud Atlas"}) return cloudAtlas 查 ...