Как правильно агрегировать объекты в Seq? - PullRequest
0 голосов
/ 03 октября 2019

Моя функция возвращает объекты (Seq [Object (1, 2), Object (1, 2)]). И моя цель состоит в том, чтобы объединить содержимое этих двух объектов в один объект следующим образом: Объекты (Объект (2, 4)). Таким образом я получаю первый результат:

 val results = ids.map { id =>
      for {
        something       <- myDAO.selectSomething(id)
        somethingf       <- myDAO.selectSomethingElse(id)
      } yield {
        MyObject(
          something,
          somethingf
        )
      }
 }

 Future.sequence(results).map(Objects(_))

1 Ответ

2 голосов
/ 03 октября 2019

Попробуйте foldLeft вот так

case class MyObject(a: Int, b: Int)
val l = List(MyObject(1,2), MyObject(1,2))
l.foldLeft(MyObject(0,0)) { (acc, o) => MyObject(acc.a + o.a, acc.b + o.b) }

или короче reduce

l.reduce { (acc, o) => MyObject(acc.a + o.a, acc.b + o.b) }

или определите MyObject добавление как инфиксный оператор

implicit class MyObjectAddition(x: MyObject) {
  def + (y: MyObject): MyObject = MyObject(x.a + y.a, x.b + y.b)
}

а затем просто reduce с

l.reduce(_ + _)

или определите Semigroup для MyObject

import cats.Semigroup
implicit val intAdditionSemigroup: Semigroup[MyObject] =
  (x: MyObject, y: MyObject) => MyObject(x.a + y.a, x.b + y.b)

и уменьшите с помощью

import cats.syntax.semigroup._
l.reduce(_ |+| _)

Все параметры вывода

res0: MyObject = MyObject(2,4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...