scala> val a = jsonMap.get("L2_ID")
a: Option[Any] = Some(List(24493, 22774, 23609, 20517, 22829, 23646, 22779, 23578, 22765, 23657))
我想获取列表的第一个元素,即24493。因此,请尝试以下代码:
scala> var b = a.map(_.toString)
b: Option[String] = Some(List(24493, 22774, 23609, 20517, 22829, 23646, 22779, 23578, 22765, 23657))
scala>
scala> var c = b.map(_.split(",")).toList.flatten
c: List[String] = List(List(24493, " 22774", " 23609", " 20517", " 22829", " 23646", " 22779", " 23578", " 22765", " 23657)")
scala> c(0)
res34: String = List(24493
这没有按预期返回。请提出建议。
答案 0 :(得分:4)
我建议您使用模式匹配。
为了防御起见,我还添加了Try
来防止您的json不是数字列表的情况。
下面的代码返回一个Option[Int]
,您可以调用.getOrElse(0)
或其他一些默认值。
import scala.util.Try
val first = a match {
case Some(h :: _) => Try(h.toString.toInt).toOption
case _ => None
}
答案 1 :(得分:2)
如果您确定它是Some
,并且列表不是空的,则可以展开该选项并使用List[Int]
获取.get
。然后,您可以使用.head
访问列表的第一个元素:
val x: Option[List[Int]] = ???
x.get.head
如果您不在REPL中,并且不确定是Some
还是None
,并且不确定List
是否包含任何元素,请使用
x.flatMap(_.headOption).getOrElse(yourDefaultValueEg0)
在具有如此强大的类型系统的语言中,“字符串类型”编程当然不是必需的,因此将所有内容转换为字符串并用逗号分隔是一种严重的错误方法。
答案 2 :(得分:2)
因此,您内部有一个Option
和List
。然后scala> var b = a.map(_.toString)
将Option
(List
)的内容转换为String
。那不是你想要的。
查看转换结果的类型,它们在那里为您提供了很好的提示。例如,b: Option[String]
告诉您您丢失了列表...
a.map(_.map(_.toString))
另一方面,类型为Option[List[String]]
:您已将列表中的每个元素都转换为字符串。
如果您只是在寻找第一个元素,则无需转换所有元素。这样的事情会做:
a
.flatMap(_.headOption) // Option[Int], containing first element or None if list was empty or id a was None
.map(_.toString) // convert Int inside of Option (if any) to String
.getOrElse("") // get the contents of the Option, or empty string if it was None