如何在scala中通过比较配置中映射列表的值来检索键



假设我有一个配置文件,内容如下:

modules :{
"google" : ["101","201","501"],
"fb" : ["201"],
"yahoo" : ["101", "104","110"],
"aws" : ["104", "110"]
}

我想通过比较与键相关的值来检索键列表(例如[google,fb]为201值)。

  1. 如果我传递201作为值,那么它应该返回[google,fb]
  2. 如果我传递101作为值,那么它应该返回[google,yahoo]
  3. 如果我传递104作为值,那么它应该返回[yahoo,aws]
  4. 如果我传递501作为值,那么它应该返回[google]
  5. 如果我传递300作为值,那么它应该返回空列表[]

使用下面的代码,我能够读取mapplist,但不能迭代并获得键列表。

val modules = configs.getObject("modules").asScala
println("modules : "+ modules)
optional_modules.foreach( x => println(x._1,  x._2.unwrapped) )
Ouput of above codebase : 
modules Map(aws -> SimpleConfigList(["104","110"]), yahoo -> SimpleConfigList(["101","104","110"]), fb -> SimpleConfigList(["201"]), google -> SimpleConfigList(["101","201","501"]))
(aws,[104, 110])
(yahoo,[101, 104, 110])
(fb,[201])
(google,[101, 201, 501])

Config转换为正常类型,例如正常Map,然后使用标准操作:

import scala.jdk.CollectionConverters._
val cfgObj = configs.getObject("modules")
val cfg = cfgObj.toConfig
val keys = cfgObj.keySet().asScala
val statuses: Map[String, List[String]] =
keys.map { key =>
key -> cfg.getStringList(key).asScala.toList
}.toMap
def find(status: String) = statuses.flatMap {
case (site, list) if list.contains(status) => List(site)
case _                                     => List.empty 
}

如果你正在做很多这样的事情,我建议使用pureconfig:

import pureconfig._
import pureconfig.generic.auto._
case class Statuses(modules: Map[String, List[String]]) {
def find(status: String) = statuses.flatMap {
case (site, list) if list.contains(status) => List(site)
case _                                     => List.empty 
}
}
val statuses = ConfigSource.fromConfig(configs).load[Statuses]
statuses.find("google")

相关内容

  • 没有找到相关文章

最新更新