Уменьшить / собрать `List <Map <String, установить <String>` в `Map <String, установить <String>>` - PullRequest
0 голосов
/ 05 апреля 2019

После выполнения parallelStream() на List я получаю List<Map<String, Set<String>.Я хочу объединить это в Map<String, Set<String>> (который будет сохранять уникальность только для List из Map с).

Я не знаком с функциями collect и reduce, так чтоНе нужно ничего делать.

Существующий код:

private val TYPES = listOf("string", "integer")

private fun getLinesOfEachTypeAcrossMultipleFiles(files: List<File>): Map<String, Set<String>> {
  return files
    .parallelStream()
    .map { file ->
      TYPES.associate {
        it to getRelevantTypeLinesFromFile(file)
      }
    }
// Converted into a Stream<String, Set<String>>
// .reduce() / collect() ?
}

private fun getRelevantTypeLinesFromFile(it: File): Set<String> {
  // Sample code
  return setOf()
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Если вы ищете эквивалентный Java-код, вы можете передать все записи, используя flatMap, а затем собрать их как карту с функцией слияния как:

Map<String, Set<String>> some(List<Map<String, Set<String>>> listOfMap) {
    return listOfMap.stream()
            .flatMap(a -> a.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (s1, s2) -> {
                        s1.addAll(s2);
                        return s1;
                    }));
}
0 голосов
/ 05 апреля 2019

Я выяснил и реализовал специфичное для Kotlin решение использования оператора fold (вместо reduce или collect):

private val TYPES = listOf("string", "integer")

private fun getLinesOfEachTypeAcrossMultipleFiles(files: List<File>): Map<String, Set<String>> {
  return files
    .map { file ->
      TYPES.associate { it to getRelevantTypeLinesFromFile(file) }
    }

    .fold(mutableMapOf<String, MutableSet<String>>()) { acc, map ->
      acc.apply {
        map.forEach { key, value ->
          acc.getOrPut(key) { mutableSetOf() }.addAll(value)
        }
      }
    }
}

private fun getRelevantTypeLinesFromFile(it: File): Set<String> {
  // Sample code
  return setOf()
}

Преимущество использования fold заключается в том, чтонам не нужно менять тип данных с Map на MutableMap и Set на MutableSet.

...