Scala 从列表的选项[Any]获取元素

Scala 从列表的选项[Any]获取元素,scala,list,option,Scala,List,Option,我想获取列表的第一个元素,即24493。因此,请尝试以下代码: scala> val a = jsonMap.get("L2_ID") a: Option[Any] = Some(List(24493, 22774, 23609, 20517, 22829, 23646, 22779, 23578, 22765, 23657)) 这并没有像预期的那样返回。请建议。如果您确定它是一个Some,并且列表不是空的,那么您可以使用.get打开该选项并获取列表[Int]。然后,您可以使用.hea

我想获取列表的第一个元素,即24493。因此,请尝试以下代码:

scala> val a  = jsonMap.get("L2_ID")
a: Option[Any] = Some(List(24493, 22774, 23609, 20517, 22829, 23646, 22779, 23578, 22765, 23657))

这并没有像预期的那样返回。请建议。

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

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
如果您不在REPL中,并且不确定它是
Some
还是
None
,以及
列表是否包含任何元素,则使用

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

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

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

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

因此,您有一个
选项
,其中有
列表
。然后
scala>var b=a.map(u.toString)
选项的内容
(a
列表
)转换为
字符串
。那不是你想要的。 看看转换结果的类型,它们可以为您提供非常好的提示<代码>b:选项[String]
,例如,告诉您已丢失列表

import scala.util.Try

val first = a match {
  case Some(h :: _) => Try(h.toString.toInt).toOption
  case _ => None
}
另一方面,具有类型
选项[List[String]]
:您已将列表中的每个元素转换为字符串

如果只是查找第一个元素,则不需要转换所有元素。这样做可以:

 a.map(_.map(_.toString))

这不是一个好答案,因为它鼓励不安全的模式(
.get
可以抛出空选项/Seq)。另外,它也不起作用,因为您不能在任何计算机上使用
.headOption
。@PhilippM Oh。。。好吧,无可否认,我错过了
选项[Any]
部分。但是我不知道你在哪里发现了使用不安全模式的任何“鼓励”:我的整个回答的后半部分展示了如何正确地使用
flatMap
getOrElse
。在交互式REPL会话期间,如果您已经看到它是一个
Some(List(34567,…)
,那么就没有必要写出
.flatMap…getOrElse
。正如我前面的评论所指出的,a.get.head只是导致bug的糟糕样式。我不会建议这是一个解决方案,以新的语言。通过这种方式开始回答,您确实鼓励OP使用此API。答案的后半部分也是破译代码。也许您可以通过修复示例并指出前半部分的缺陷来改进它,因为它不会导致错误。在输入时,
val a=Some(列表(24493))
会导致
24493
,而不会导致其他结果。同样地,
Some(List(24493)).flatMap(u.headOption).getOrElse(42)
编译并运行得很好,在什么意义上它是“坏的”?请尝试None.get或Nil.head。是的,如果JSON对象不符合预期的形状,则这些是错误。如果按照OP的定义使用
a
,则代码不起作用。请将此内容复制/粘贴到回复中,以了解原因,或者再次阅读我对您答案的第一条评论(任何dos未定义.headOption)。这将是我对你的回答的最后一点评论,我不是来教你Scala的,对不起。
任何
通常都是一些东西的渐近线wrong@KamalKishore如果此答案解决了您的问题,请将此问题标记为已解决。
 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