Scala选项和迭代器示例

时间:2020-02-23 14:41:47  来源:igfitidea点击:

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迭代器

迭代器允许用户遍历集合,从而访问所有元素。
迭代器的核心操作是nexthasNext
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→将这个集合的元素相乘。