scala将map[string,any]中的arraylist转换为seq

sg2wtvxw  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(941)

我在试着读一本书 .yaml 文件到我的scala代码中。假设我有 yaml 文件:

animals: ["dog", "cat"]

我正在尝试使用以下代码读取它:

val e = yaml.load(os.read("config.yaml")).asInstanceOf[java.util.Map[String, Any]]
val arr = e.getOrDefault("animals", new Java.util.ArrayList[String]()) // arr is Option[Any], but I know it contains java.util.ArrayList<String>
arr.asInstanceOf[Buffer[String]] // ArrayList cannot be cast to Buffer

arraylist是any类型,那么如何将其转换为scala集合(例如buffer)(或seq,list…)

mi7gmzs6

mi7gmzs61#

snakeyaml(假设您使用的是什么)不能直接提供类似于scala集合的缓冲区。
但您可以要求它提供字符串的arraylist,然后将其转换为所需的任何内容。

import scala.jdk.CollectionConverters._
val list = arr.asInstanceOf[util.ArrayList[String]].asScala

结果:

list: scala.collection.mutable.Buffer[String] = Buffer(dog, cat)
uqxowvwt

uqxowvwt2#

另一个选项是定义配置的模型,例如:

class Sample {
  @BeanProperty var animals = new java.util.ArrayList[String]()
}

下面将创建 Sample :

val input = new StringReader("animals: [\"dog\", \"cat\"]")
val yaml = new Yaml(new Constructor(classOf[Sample]))
val sample = yaml.load(input).asInstanceOf[Sample]

然后,使用 CollectionConverters 在scala 2.13中,或 JavaConverters 在scala 2.12或更早版本中,转换 animals 进入scala结构:

val buffer = sample.getAnimals.asScala

代码在scastie运行。

相关问题