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→将这个集合的元素相乘。