gpt4 book ai didi

scala - 从列表选项创建 map

转载 作者:行者123 更新时间:2023-12-04 14:27:45 25 4
gpt4 key购买 nike

我正在尝试从列表选项创建 map 。所以,我有一个这样声明的列表选项:
val authHeaders: Option[Set[String]] = Some(Set("a", "b", "c"))
我想得到这样的 map :(a -> a,b -> b,c -> c)。

所以我尝试了这种方式:

for {
headers <- authHeaders
header <- headers
} yield (header -> header)

但我收到此错误:
<console>:11: error: type mismatch;
found : scala.collection.immutable.Set[(String, String)]
required: Option[?]
header <- headers
^

我哪里做错了?

附加说明:Option 这个东西一直让我很头疼,但我需要了解在任何情况下如何处理它。无论如何,为了比较,我尝试通过删除选项来消除头痛因素。
scala> val bah = Set("a", "b", "c")
bah: scala.collection.immutable.Set[String] = Set(a, b, c)

scala> (
| for {
| x <- bah
| } yield (x -> x)).toMap
res36: scala.collection.immutable.Map[String,String] = Map(a -> a, b -> b, c -> c)

所以,显然它有效。这里有什么区别?

补充说明:

看起来像这里“for comprehension”的游戏规则:如果它产生某些东西,那么某些东西必须与外部集合的类型相同(在这种情况下是 authHeaders,它是一个 Option[?])。如何解决它?

谢谢!,
拉卡

最佳答案

问题

您的 for脱糖为:

authHeaders.flatMap(headers => headers.map(header => header -> header))

这种情况下的问题是 flatMap 的用法, 因为 authHeadersOption .
让我们来看看签名。 ( http://www.scala-lang.org/api/2.11.1/index.html#scala.Option )
final def flatMap[B](f: (A) ⇒ Option[B]): Option[B]

所以函数 f预计返回 Option .但是 authHeaders.map(header => header -> header)不是 Option因此你会得到一个错误。

一个解决方案

假设如果 authHeadersNone你想要一个空的 Map ,我们可以使用 fold .
authHeaders.fold(Map.empty[String, String])(_.map(s => s -> s).toMap)

第一个参数是结果 if authHeadersNone .第二个预计是一个函数 Set[String] => Map[String, String]并评估是否存在 Set .

如果您想将结果保留在 Option 中并且只想拥有一个 Map当实际上有一些 Set ,您可以简单地使用 map .
authHeaders.map(_.map(s => s -> s).toMap)

关于您的附加说明

这是 flatMap的签名在 TraversableOnce . ( http://www.scala-lang.org/api/2.11.1/index.html#scala.collection.TraversableOnce )
def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): TraversableOnce[B]

这里 f可以返回作为 GenTraversableOnce 实例的任何集合.

所以这样的事情是可能的: Set(1,2,3).flatMap(i => List(i)) (这不是一个真正有创意的例子,我知道..)

我看到 Option作为特例。

关于scala - 从列表选项创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com