Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Typesafe配置中获取列表列表_Java_List_Config_Typesafe - Fatal编程技术网

Java 如何在Typesafe配置中获取列表列表

Java 如何在Typesafe配置中获取列表列表,java,list,config,typesafe,Java,List,Config,Typesafe,我有一张清单,上面有一张清单。基本上我想做的是提取一个多重映射 myconfig { values = [ [ 'key1', 'value1'], [ 'key1', 'value2'], [ 'key2', 'value2'], [ 'key2', 'value3'], ] 我必须使用的解决方案: myconfig { values = { key1 : [ 'value1' , 'value2' ] key2

我有一张清单,上面有一张清单。基本上我想做的是提取一个多重映射

myconfig {
  values = [
      [ 'key1', 'value1'],
      [ 'key1', 'value2'],
      [ 'key2', 'value2'],
      [ 'key2', 'value3'],
    ]
我必须使用的解决方案:

myconfig {
  values = {
    key1 : [ 'value1' , 'value2' ]
    key2 : [ 'value2' , 'value3' ]
  }
}

有没有一种提取原始列表的好方法?所有函数都需要一个路径,因此一旦我提取“值”,似乎就没有直接的方法访问内部列表。

您可以使用
Config
对象上的
getList(字符串路径)
来获取
ConfigList
对象

Java:

config.getList("path.to.keys").stream()
  .map(configValue -> (ArrayList) configValue.unwrapped())
  .collect(Collectors.toList())
ConfigList
包含
ConfigValue
实例。在这种情况下,typesafe人员在内部将列表表示为ArrayList,因此您必须在打开
ConfigValue
对象时进行转换

上面的代码段返回列表的列表。如果要展平列表,请使用flatMap而不是Map,并在lambda中返回一个流

编辑

下面是等效的Scala:

  import scala.collection.JavaConversions._
  val keys: Map[String, String] = config.getList("path.to.keys")
    .map(configValue =>
      configValue.unwrapped().asInstanceOf[ArrayList[String]]
    )
    .foldLeft(Map[String, String]())( (map, list) =>
      map + (list(0) -> list(1))
    )

发现如果列表中的所有类型都不相同,那么这还不够。例如,假设您定义了一个双列表列表,在您的配置中它是:[[3,4.3],…]第一个数字将被解析为一个整数,当以双精度访问时,您将得到一个ClassCastException。因此,在本例中,我必须更具体地说明:cv.unwrapped().asInstanceOf[util.ArrayList[Number]].asScala.toList.map(u.doubleValue())