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的更多相关文章

  1. Scala实践14

    1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...

  2. Scala实践13

    1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...

  3. Scala实践12

    1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...

  4. Scala实践11

    1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...

  5. Scala实践10

    1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...

  6. Scala实践6

    1  if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...

  7. Scala实践8

    1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...

  8. Scala实践7

    一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...

  9. Scala实践5

    一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...

随机推荐

  1. 2013-10-7 设置combboxItem高度的方法

    //首先设置一个较大的 ItemHeight 值,比如 20: //然后设置 ComboBox 的 DrawMode 为 OwnerDrawVariable: //再设置DrawItem事件如下 if ...

  2. jQuery中的siblings()的用法

    siblings  英文翻译    兄; 弟; 姐; 妹;   的意思 siblings()用于查找当前元素的同胞元素,就是拿到当前元素的兄弟节点(不包括自己). 给当前元素设置新的样式,并删除当前元 ...

  3. IntStack(存放int型值,带迭代器) 附模板化实现 p406

    1 该栈只用于存在int型数据 #include "../require.h" #include <iostream> using namespace std; cla ...

  4. JVM基础--JVM参数之堆栈空间配置

    目录 堆配置 年轻代 Eden区 永久代(JDK1.7) 元空间(JDK1.8) 栈空间 直接内存 总结 参考资料 JVM系列目录 JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问 ...

  5. centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口

    问题一:连接数据库时直接使用ip地址无法连接,必须使用ssh方式才能连接? 问题二:ssh登录服务器时必须使用22端口,在/etc/ssh/sshd_config中添加了10086端口,防火墙中已开启 ...

  6. 再一次利用with as 优化SQL

    上海的一个哥们问我有个SQL跑了4个小时都没跑完,实在受不了了,找我优化一下.我确实挺佩服他的,要是我遇到跑了几分钟的,就受不了了. SQL语句和执行计划如下: --sql id:1qbbw3th4x ...

  7. C# 获取 PC 序列号

    在 C++ 需要使用 GetSystemFirmwareTable 的方法来获得 PC 的序列号,需要写的代码很多,但是在 C# 可以使用 WMI 来拿到序列号 首先是安装 System.Manage ...

  8. 2019-10-12-win10-uwp-非ui线程访问-ui-

    title author date CreateTime categories win10 uwp 非ui线程访问 ui lindexi 2019-10-12 15:0:12 +0800 2018-2 ...

  9. Vijos1788 第K大 [模拟]

    1.题意:给定N个数字,和一个值K,要求输出一组数据中第K大的数字,其中30%的测试点满足:n <= 100;60%的测试点满足:n <= 1000;100%的测试点满足:n <= ...

  10. 深入浅出Java并发中的CountDownLatch

      1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...