加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 从列表选项创建地图

发布时间:2020-12-16 18:53:57 所属栏目:安全 来源:网络整理
导读:我正在尝试从列表选项中创建一个地图.所以,我有一个像这样声明的列表选项: val authHeaders:选项[Set [String]] = Some(Set(“a”,“b”,“c”)) 我希望得到这样的地图:(a – a,b – b,c – c). 所以我尝试了这种方式: for { headers - authHeaders head
我正在尝试从列表选项中创建一个地图.所以,我有一个像这样声明的列表选项:

val authHeaders:选项[Set [String]] = Some(Set(“a”,“b”,“c”))

我希望得到这样的地图:(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
                    ^

我哪里做错了?

补充说明:这个选项让我非常头疼,但我需要了解如何在任何情况下处理它.无论如何,仅仅为了比较,我尝试通过删除选项来消除头痛因素.

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 [?]).如何解决它?

谢谢!,
拉嘎

解决方法

问题

你的被贬低了:

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

这种情况下的问题是使用flatMap,因为authHeaders是一个选项.
让我们来看看签名. (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,因此会出错.

一个办法

假设如果authHeaders为None,你想要一个空的Map,我们可以使用fold.

authHeaders.fold(Map.empty[String,String])(_.map(s => s -> s).toMap)

如果authHeaders为None,则第一个参数是结果.第二个预计是函数Set [String] =>如果有一些Set,则映射[String,String]并进行评估.

如果您想将结果保留在Option中,并且只想在实际存在某个Set时使用Map,则可以简单地使用map.

authHeaders.map(_.map(s => s -> s).toMap)

关于你的附加说明

这是TraversableOnce上flatMap的签名. (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是一个特例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读