Группировка concat для последовательности объектов case в Scala - PullRequest
0 голосов
/ 09 марта 2019

Мне интересно, есть ли изящный способ сделать групповое объединение чистым scala для последовательности объекта case scala. Вот как я это сделал.

case class UserToAccounts
(
  id: Int,
  email: String,
  firstName: String,
  lastName: String,
  accountId: Seq[Int]
)

case class User
(
  id: Int,
  email: String,
  firstName: String,
  lastName: String,
  accountId: Int
)

val users = Seq(
  User(1, "foo@test.com", "test", "foo", 1),
  User(1, "foo@test.com", "test", "foo", 2),
  User(2, "bar@test.com", "test", "bar", 1)
)

val groupedUsers = users
      .groupBy(u => (u.id, u.email, u.firstName, u.lastName))
      .mapValues( x => x.map( y => y.accountId))
      .map(z => UserToAccounts(
      id = z._1._1,
      email = z._1._2,
      firstName = z._1._3,
      lastName = z._1._4,
      accountIds = z._2
    ))

println(groupedUsers)

List(UserToAccounts(2,bar@test.com,test,bar,List(1)), UserToAccounts(1,foo@test.com,test,foo,List(1, 2)))

Заранее благодарим за добрый совет.

1 Ответ

1 голос
/ 09 марта 2019

Вы просто сможете группировать по id класса User, что даст вам карту от User.id до List[User]. Затем вы можете отобразить это и использовать его для непосредственного создания вашего UserToAccounts объекта. Вам нужно будет map сверх userList, чтобы извлечь все идентификаторы учетной записи для этого пользователя:

users.groupBy(_.id).map {
  case (userId, userList) =>
    val user = userList.head
    UserToAccounts(userId,
                   user.email,
                   user.firstName,
                   user.lastName,
                   userList.map(_.accountId))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...