从列表的Option [Any]中获取元素

时间:2018-12-23 04:01:44

标签: scala list option

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

这没有按预期返回。请提出建议。

3 个答案:

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

因此,您内部有一个OptionList。然后scala> var b = a.map(_.toString)OptionList)的内容转换为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