在SCALA

时间:2018-10-19 15:47:53

标签: scala scala-option

我是Scala的新手,我一直在寻找如何从Option[String]更改为Map[String,trait],但找不到太多内容的方法。

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

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

我们可以在其中使用Option.fold吗?

请您进一步指导我。

TIA

2 个答案:

答案 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 })
  )