scala – 从列表选项创建地图
我正在尝试从列表选项中创建一个地图.所以,我有一个像这样声明的列表选项:
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是一个选项. 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是一个特例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |