【问题标题】:Converting from java ArrayList obtained from unwrapped() to Scala list从 unwrapped() 获得的 java ArrayList 转换为 Scala 列表
【发布时间】:2018-10-12 20:35:55
【问题描述】:

语言:SCALA
我的属性文件中有一个map 定义为:

dummy {
  "Key1" : ["value1","value2", "value3"]
  "Key2" : ["Hi1", "Hi2"]
  "Key3" : ["Bye1"]
}

现在,我可以为上面的map 找到entryset 并将其填入scala 的map 为:

var configTrialMap: Config = config.getConfig("dummy")
val resMap = mutable.Map[String, List[String]]()
for (entry <- configTrialMap.entrySet.asScala) {
    resMap.put(entry.getKey, entry.getValue.unwrapped().toString.split(",").map(_.trim).toList)
}

但问题是这段代码看起来很笨拙,我必须使用一些正则表达式将所有 [, ] 替换为空白字符

我已经看到了一些将 java 集合转换为 scala 的解决方案,但它们似乎都没有工作,因为 unwrapped() 返回一个 Object 实例,我必须先转换它。

我试过玩:

  1. asScalaBuffer (https://alvinalexander.com/scala/how-to-go-from-java-collections-convert-in-scala-interact)

  2. val javaToScalaList = entry.getValue.unwrapped().asInstanceOf[List[String]]

  3. .asScala.toList

对不起,如果太天真了。我是 scala 的新手。

【问题讨论】:

  • 如果configTrialMap是一个java map(比如说java.util.HashMap),那么你可以通过configTrialMap.asScala简单地获取Scala map
  • @jrook 不,它不是 Java 地图。它是一个配置对象。我可能没明白你的意思?您能否详细说明您要求进行哪些更改...
  • 能否请您添加有关 Config 类的详细信息?它的完全限定名称是什么? (名称包括类的整个路径)。既然你说它是map,我认为它可能是java.util.HashMap。如果不正确,那是什么地图?
  • 它是 com.typesafe.config.Config 。当我说它是一张地图时,我的意思是在配置文件中定义的地图(我想转换为实际 scala 地图的虚拟地图)希望它能帮助@jrook

标签: java scala configuration config configuration-files


【解决方案1】:

你可以这样做:

  import com.typesafe.config.ConfigFactory
  import scala.collection.JavaConverters._
  //load config into configTrialMap

configTrialMap.getObject("dummy")
  .keySet().asScala
  .map(k => {
    val k2 = k.replaceAll("\\.", "\".\"")  //quote all the dots in key
    ("dummy."+k2, configTrialMap.getStringList(s"dummy." + k2).asScala.toList)
  })
  .toMap

导致:

scala.collection.immutable.Map[String,List[String]] = Map(dummy.U"."S"." Sample -> List(Bye1), dummy.Key2 -> List(Hi1, Hi2), dummy.Key1 -> List(value1, value2, value3))

编辑:(添加正则表达式替换以修复带点的路径)

要处理键中的点,您需要使用" 字符来引用它们。我已经使用执行此操作的正则表达式更新了答案。

【讨论】:

  • 完美先生 :) 我能够成功地使用您的逻辑并对其进行调整,以根据其他要求相应地创建 Map[String, String] 的地图。再次感谢
  • 如果 key 像“U.S. Sample”那么它会失败,有什么解决方法吗? - 我试图加上引号,包裹在对象下 - 但它们都不起作用。在制作地图和使用getString() 方法时还尝试了U"""."""S""".""" 和转义引号,但到目前为止没有运气
  • 谢谢大哥,我马上去试试,现在回家了:)
  • 它可以工作,但是当我有一些“运行时随机值”并想在地图的keyset() 中找到它时,首先我必须对那个“运行时随机值”使用相同的正则表达式。有点hack但不干净,还有其他建议吗?
  • @JeetendraAhuja,这是另一个问题,可以通过 finalConfigTrial.map {case (k,v) =&gt; (k.replace(""""""",""), v)} 之类的方式轻松解决。
猜你喜欢
  • 2017-11-15
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多