MAP如何在Scala中的选项上使用



我有这两个函数

  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

使用这些方法,您很少需要使用匹配语句来取消选项。

相关内容

  • 没有找到相关文章

最新更新