假设我有一个配置文件,内容如下:
modules :{
"google" : ["101","201","501"],
"fb" : ["201"],
"yahoo" : ["101", "104","110"],
"aws" : ["104", "110"]
}
我想通过比较与键相关的值来检索键列表(例如[google,fb]为201值)。
。
- 如果我传递201作为值,那么它应该返回
[google,fb]
- 如果我传递101作为值,那么它应该返回
[google,yahoo]
- 如果我传递104作为值,那么它应该返回
[yahoo,aws]
- 如果我传递501作为值,那么它应该返回
[google]
- 如果我传递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")