scala 从列表的选项[ANY]中提取元素

qnyhuwrf  于 2022-11-09  发布在  Scala
关注(0)|答案(3)|浏览(242)
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

这并没有像预期的那样回归。

olhwl3o2

olhwl3o21#

我建议您使用模式匹配。为了防患于未然,我还添加了一个Try,以防止json不是数字列表的情况。下面的代码返回Option[Int],您可以对其调用.getOrElse(0)-如果您愿意,也可以调用其他默认值。

import scala.util.Try

val first = a match {
  case Some(h :: _) => Try(h.toString.toInt).toOption
  case _ => None
}
raogr8fs

raogr8fs2#

所以,你有一个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
bqucvtff

bqucvtff3#

如果您确定它是Some,并且列表不为空,那么您可以解开选项并使用.get获得List[Int]。然后,您可以使用.head访问列表的第一个元素:

val x: Option[List[Int]] = ???
x.get.head

如果您不在REPL中,并且不确定它是Some还是None,并且List是否有任何元素,则使用

x.flatMap(_.headOption).getOrElse(yourDefaultValueEg0)

在拥有如此强大的类型系统的语言中,“字符串类型”编程当然不是必需的,因此将所有内容转换为字符串并用逗号分隔是一种有严重缺陷的方法。

相关问题