Полугруппа Cats для объединения Списка HashMaps в Один Scala - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть список hashMaps следующим образом:

val listHashMaps = List(Map(1 -> List("one", "A") , Map(2 -> List("two", "B"), Map(3 -> List("three", "C"), Map(4 -> List("four", "D")

Я хочу объединить эти HashMaps в одну HashMap как:

 Map(1 -> List("one", "A"), 2 -> List("two", "B"), 3 -> List("three", "C", 4 -> List("four", "D")

Я пробовал

listHashMaps.flatten.ToHashMap, но, похоже, не работает. и я читал, что это можно сделать с помощью полугрупп из кошек следующим образом, но я могу выяснить, как перебирать список для объединения HashMaps в один.

val combinedMap = Semigroup[HashMap[Int, List[String]]].combine(aMap, anotherMap)

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать либо NonEmptyList, а затем полугруппу по умолчанию (которая просто объединит карты), либо использовать небезопасную функцию .reduce в List.

Причина, по которой это небезопасно, состоит в том, что он взорвется в пустом списке. Пример:

import cats.data.NonEmptyList

import scala.collection.immutable
import cats.implicits._

object Foo extends App {

  val listHashMaps: List[Map[Int, List[String]]] = List(
    Map(1 -> List("one", "A")),
    Map(2 -> List("two", "B")),
    Map(3 -> List("three", "C")),
    Map(4 -> List("four", "D"))
  )

  val one: Map[Int, List[String]] = listHashMaps.reduce(_ ++ _)

  // safe
  val nonEmpty: NonEmptyList[Map[Int, List[String]]] = NonEmptyList.of(
    Map(1 -> List("one", "A")),
    Map(2 -> List("two", "B")),
    Map(3 -> List("three", "C")),
    Map(4 -> List("four", "D"))
  )

  val two: Map[Int, List[String]] = nonEmpty.reduce

  println(one)
  println(two)
}
...