【问题标题】:Convert Option[String] to Map[String,trait] in SCALA在 SCALA 中将 Option[String] 转换为 Map[String,trait]
【发布时间】:2018-10-19 15:47:53
【问题描述】:

我是 Scala 新手,并搜索了如何从 Option[String] 更改为 Map[String,trait] 但找不到太多内容。

问题是我有一个Option[String] 类型的字段,我必须将该值传递给一个案例类,该类将输入作为Map[String,User Defined trait]

这就是我想知道如何将Option[String] 的值转换为Map[]

我们可以在这里使用Option.fold吗?

请您进一步指导我。

TIA

【问题讨论】:

  • 我认为我们需要更多详细信息。一个 Option[String] 最多包含一个 String 实例。

标签: scala scala-option


【解决方案1】:

考虑使用toMap,如下例所示:

trait UDTrait[A] {
  def len(s: A): Int
}

case class MyClass(m: Map[String, UDTrait[String]])

def myOptionToMap(opt: Option[String]): Map[String, UDTrait[String]] =
  opt.map((_, new UDTrait[String]{ def len(s: String) = s.length })).toMap

MyClass(myOptionToMap(Some("a")))
// res1: MyClass = MyClass(Map(a -> $anonfun$myOptionToMap$1$$anon$1@10aabada))

MyClass(myOptionToMap(None))
// res2: MyClass = MyClass(Map())

也可以使用fold,如下:

def myOptionToMap(opt: Option[String]): Map[String, UDTrait[String]] =
  opt.fold(Map.empty[String, UDTrait[String]])(s =>
    Map(s -> new UDTrait[String]{ def len(s: String) = s.length })
  )

【讨论】:

  • 感谢您的解释。你能解释一下上面的 fold myOptionToMap 方法是如何工作的吗?我一直在尝试理解 fold 的工作原理,但不太了解。
  • 我在我的代码中使用了 fold,但它给出了一个错误并告诉我要编写实现的方法。可能是什么原因?当我实现这些方法时,即使错误仍然存​​在。
  • 我添加了那个,但即使在那之后它也会出错。你能解释一下折叠功能的工作原理吗
  • 如提供的 API 文档中所述,fold 具有签名 def fold[B](ifEmpty: => B)(f: (A) => B): B。如果选项非空,folds => Map(s -> new UDTrait{}) 函数应用于选项的值;否则返回ifEmpty 表达式的值,即Map.empty[String, UDTrait]
  • trait UDTrait[A <: any a>
【解决方案2】:

Option[ T ] 是零个或一个给定类型元素的容器。 Option[T] 可以是 Some[T]None 对象,表示缺失值。

Map 是一个由键和值对组成的 Iterable。如果你想从一个非空的选项构造一个键值对的映射,你可以执行以下操作:

trait Foo

def convertNonEmptyOptionToMap(a:Some[String], t: Foo): Map[String, Foo] = Map(a.get -> t)

也就是说,我不完全理解你想要做什么。更多的例子会有帮助。

【讨论】:

  • 如果你想让你的方法接受一个非空的Option,那么你的参数就是Some。或者,您可以接受可能为空的Option 并使用a.map(x =&gt; Map(x, t)).getOrElse(Map.empty) 之类的代码。
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2013-05-24
相关资源
最近更新 更多