Scala选项和迭代器示例
Scala选项可以定义为包含零个或者多个给定类型元素的容器。
Option [T]可以返回代表缺失值的Some [T]或者None对象。
考虑一个如何创建一个选项的例子。
val msg : Option[String] = Some("Option is a Scala collection")
考虑一个如何分配无值的例子。
val msg : Option[String] = None
在Scala IDE中将Student.scala类创建为;
case class Student(
id: Int,
Name: String,
marks: Float,
gender: Option[String])
object TestStudent {
private val students = Map(1 -> Student(10, "John", 62.5f, Some("male")),
2 -> Student(12, "Adam", 70.5f, Some("female")))
def findById(id: Int): Option[Student] = students.get(id)
def findAll = students.values
}
其中我们定义了一个以id,名称,标记和性别为属性的类学生。
创建一个对象" TestStudent",其中定义" findById"方法,该方法返回"学生"类型的"选项"和" findAll",后者从"学生"映射中检索值。
现在创建另一个对象s1.scala作为S1.scala
object S1 {
def main(args: Array[String]) {
val st1 = TestStudent.findById(2)
if (st1.isDefined) {
println(st1.get.id)
println(st1.get.Name)
println(st1.get.marks)
}
}
}
下图显示了将S1作为scala应用程序运行时产生的输出。
让我们看一下Scala Option的其他示例。
指定默认值
可以使用getOrElse方法指定默认值。
例如,如下创建一个scala对象:GetorElse.scala
object GetorElse {
def main(args: Array[String]) {
val stud = Student(14, "Chris", 45f, None)
println(stud.gender.getOrElse("Gender not specified"))
}
}
下图显示了由于缺少性别而产生的默认值输出。
创建螺柱实例时将性别指定为"无",因此将显示消息"未指定性别"。
模式匹配
可选值可以通过模式匹配分开。
例如:
KeyPatternMatch.scala
object KeyPatternMatch {
def main(args: Array[String]) {
val student = Map(12 -> "Anderson", 14 -> "Reena")
println("Student Name with id 12 : " + displaykey(student.get(12)))
println("Student Name with id 14 : " + displaykey(student.get(14)))
}
def displaykey(a: Option[String]) = a match {
case Some(t) => t
case None => "?"
}
}
输出:
Student Name with id 12 : Anderson Student Name with id 14 : Reena
isEmpty()方法
isEmpty()方法用于检查选项是否返回空。
例如; Empty.scala
object Empty {
def main(args: Array[String]) {
val x: Option[Int] = Some(5)
val y: Option[Int] = None
println("Check X is Empty: " + x.isEmpty)
println("Check Y is Empty: " + y.isEmpty)
}
}
它产生以下输出。
Check X is Empty: false Check Y is Empty: true
有用的期权方法
def isDefined:布尔值→如果选项是Some的实例,则返回true,否则返回false
def或者Null→如果选项为非空,则返回该选项的值;如果为空,则返回null。
def isEmpty:布尔值→如果选项为None,则返回true,否则返回false。
def get:X→返回选项的值。
def foreach [Y](f:(Z)=> Y):单位→如果给定的值f为非空,则将其应用于选项的值。
Scala迭代器
迭代器允许用户遍历集合,从而访问所有元素。
迭代器的核心操作是next和hasNext。
next元素返回后继元素,并且hasNext检查该元素是否存在。
例如;
将标量对象Iterator.scala创建为Iterator.scala
object Car {
def main(args: Array[String]) {
val car = Iterator("Santro", "Punto", "WagonR", "Polo", "Audi")
while (car.hasNext) {
println(car.next())
}
}
}
输出:
Santro Punto WagonR Polo Audi
迭代器的长度
大小或者长度方法可用于查找迭代器中元素的数量。
例如," CarLength.scala"
object CarLength {
def main(args: Array[String]) {
val c1 = Iterator("Santro", "Punto", "WagonR", "Polo", "Audi")
val c2 = Iterator("Volkswagen", "Alto", "Xylo", "Innova")
println("Iterator c1 : " + c1.size)
println("Length of c2 : " + c2.length)
}
}
输出:
Iterator c1 : 5 Length of c2 : 4
查找最小和最大元素
使用it.min和it.max方法来查找迭代器中的最小和最大元素。
创建scala对象" MinMax.scala"为; MinMax.scala
object MinMax {
def main(args: Array[String]) {
val m1 = Iterator(12,45,67,89)
val m2 = Iterator(44,66,77,88)
println("Smallest element " + m1.min )
println("Largest element " + m2.max )
}
}
输出:
Smallest element 12 Largest element 88
有用的迭代器方法
def addString(x:StringBuilder):StringBuilder→返回附加了元素的字符串生成器x。
def缓冲:BufferedIterator [X]→从此迭代器创建一个缓冲的迭代器。
def foreach(f:(X)=> Unit):单位→将函数f应用于此迭代器产生的所有值。
def indexOf(elem:Y):Int→返回指定对象在此可迭代对象中首次出现的索引。
def product:X→将这个集合的元素相乘。

