Как получить список списков в Typesafe Config

У меня есть конфигурация typesafe со списком списков. В основном то, что я пытаюсь сделать, это извлечь мультикарту.

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

Обходной путь, который я должен использовать:

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

Есть ли хороший способ извлечь исходный список списков? Все функции ожидают путь, поэтому, как только я извлекаю «значения», похоже, нет прямого доступа к внутреннему списку.


person DHa    schedule 15.06.2017    source источник


Ответы (1)


Вы можете использовать getList(String path) на объекте Config, чтобы получить объект ConfigList.

Java:

config.getList("path.to.keys").stream()
  .map(configValue -> (ArrayList) configValue.unwrapped())
  .collect(Collectors.toList())

ConfigList содержит ConfigValue экземпляров. В этом случае люди, поддерживающие типизацию, представляют список внутри как ArrayList, поэтому вам нужно выполнить приведение, когда вы разворачиваете объект ConfigValue.

Приведенный выше фрагмент возвращает список List. Если вы хотите сгладить список, используйте flatMap вместо Map и верните поток в лямбда-выражении.

Изменить

Вот эквивалент 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))
    )
person Quy    schedule 30.06.2017
comment
Было обнаружено, что этого недостаточно, если все типы в списке не совпадают. Скажем, например, вы определили список двойных списков, и в вашей конфигурации это было: [[3, 4.3], ...] первое число будет проанализировано как целое число, и вы получите ClassCastException при доступе как к двойному. Так что в этом случае мне нужно было более конкретно: cv.unwrapped().asInstanceOf[util.ArrayList[Number]].asScala.toList.map(_.doubleValue()) - person user79074; 27.03.2018