我有这两个函数
def pattern(s: String): Option[Pattern] =
try {
Some(Pattern.compile(s))
} catch {
case e: PatternSyntaxException => None
}
和
def mkMatcher(pat: String): Option[String => Boolean] =
pattern(pat) map (p => (s: String) => p.matcher(s).matches)
MAP是将给定函数应用于列表的每个元素的高级函数。
现在,我没有根据上述语句获得该地图的工作方式。
MAP是将给定函数应用于列表的每个元素的高阶函数。
这是映射的罕见限制性定义。
无论如何,它起作用是因为它是由不坚持这个的人定义的。
例如,有人写了类似于
的东西sealed trait Option[+A] {
def map[B](f: A => B): Option[B] = this match {
case Some(value) => Some(f(value))
case None => None
}
}
作为标准库的一部分。这使得适用于Option[A]
它之所以定义,是因为映射多种数据结构不仅列表是有意义的。映射是应用于数据结构所保存的元素的转换。
它对每个元素都应用一个函数。
Option[A]
可以被认为是微不足道的序列。它具有零或一个元素。要映射它意味着如果它具有一个函数。
现在,始终使用此设施可能没有多大意义,但是在某些情况下它很有用。
例如,这是几种不同的方法之一,当存在时,启用以可以在类型上操作。Option[A]
可以用于方便的表达式中。
例如
val option: Option[Int] = Some(2)
val squared: Option[Int] = for {
n <- option
if n % 2 == 0
} yield n * n
有趣的是,这意味着 filter 也在Option[A]
。
如果您只有一个简单的值,那么使用不太通用的构造可能会更清楚。
地图的工作方式与列表和向量等其他集合类型相同。它将您的功能应用于集合的内容,可能会更改类型,但要保持集合类型相同。
在许多情况下,您可以像具有0或1个元素的集合一样对待选项。您可以在选项上进行许多相同的操作。
您可以修改值
var opt = Option(1)
opt.map(_ + 3)
opt.map(_ * math.Pi)
opt.filter(_ == 1)
opt.collect({case i if i > 0 => i.toString })
opt.foreach(println)
您可以测试值
opt.contains(3)
opt.forall(_ > 0)
opt.exists(_ > 0)
opt.isEmpty
使用这些方法,您很少需要使用匹配语句来取消选项。