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.其中 ...
随机推荐
- 2018-8-10-win10-uwp-获得元素绝对坐标
title author date CreateTime categories win10 uwp 获得元素绝对坐标 lindexi 2018-08-10 19:16:51 +0800 2018-2- ...
- HTML5 meta 属性整理
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- [转载] 使用StAX解析xml
StAX 概述 从一开始,Java API for XML Processing (JAXP) 就提供了两种方法来处理 XML:文档对象模型(DOM)方法是用标准的对象模型表示 XML 文档:Simp ...
- H3C 调试OSPF
- H3C 显示RIP当前运行状态及配置信息
- echarts 图表自适应外部盒子大小
项目中用到了echarts,由于页面是自适应的,还得兼容移动, 因此图表还需要根据盒子的大小来变化. 自适应窗口及盒子大小 页面中有一个[放大.缩小]功能,及全屏展示和预览图表 窗口自适应 let m ...
- Jmeter完整Demo
1:创建一个线程组 2:添加一个cookie管理器 3:设置你的信息头管理器:application/json;text/plain;charset=UTF-8 44 4:添加一个用户参数,做全局变量 ...
- linux 一次对一个用户限制存取
单打开设备之外的下一步是使一个用户在多个进程中打开一个设备, 但是一次只允许一个 用户打开设备. 这个解决方案使得容易测试设备, 因为用户一次可从几个进程读写, 但是 假定这个用户负责维护在多次存取中 ...
- dotnet core 黑科技·String
本文来告诉大家 dotnet core 里面使用的黑科技,如何提高String.IndexOf(char)的性能 在Performance Improvements in .NET Core有说道哪些 ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...