地图如何在 Scala 中的选项上工作?

How map work on Options in 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 is the higher-order function that applies a given function to each element of a list.

这是一个非常严格的地图定义。

无论如何,它之所以有效,是因为它是由不坚持这一点的人定义的。

例如,有人写了类似于

的东西
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] 可以被认为是一个平凡的序列。它有零个或一个元素。映射它意味着如果它有一个元素,就将函数应用到它的元素上。

现在一直使用这个工具可能没有多大意义,但在某些情况下它很有用。

例如,它是少数几个不同的方法之一,当存在时启用 For Expressions 以对类型进行操作。 Option[A]可以用在for表达式中,比较方便。

例如

val option: Option[Int] = Some(2)

val squared: Option[Int] = for {
  n <- option
  if n % 2 == 0
} yield n * n

有趣的是,这意味着 filter 也在 Option[A].

上定义

如果您只有一个简单的值,使用不太通用的构造可能会更清楚。

Map 的工作方式与其他集合类型(如 List 和 Vector)相同。它将您的函数应用于集合的内容,可能会更改类型但保持集合类型不变。

在许多情况下,您可以将选项视为具有 0 个或 1 个元素的集合。您可以对 Option 执行很多与对其他集合相同的操作。

可以修改数值

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

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