地图如何在 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
使用这些方法,您很少需要使用匹配语句来取消选择选项。
我有这两个功能
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
使用这些方法,您很少需要使用匹配语句来取消选择选项。