我是Scala的新手,我一直在寻找如何从Option[String]
更改为Map[String,trait]
,但找不到太多内容的方法。
问题是我有一个Option[String]
类型的字段,我必须将该值传递给一个将输入作为Map[String,User Defined trait]
的case类。
我想知道如何将Option[String]
的值转换为Map[]
我们可以在其中使用Option.fold
吗?
请您进一步指导我。
TIA
答案 0 :(得分:0)
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)
也就是说,我不完全了解您要做什么。带有示例的更多上下文会有所帮助。
答案 1 :(得分:0)
请考虑使用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())
请注意,toMap
采用元组2,因此采用s => (s, new UDTrait{})
映射。
或者,您可以使用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 })
)