Как выбрать поле объекта для значения карты в Scala, используя groupby - PullRequest
5 голосов
/ 03 марта 2012

Вот вопрос новичка в скале. У меня есть список людей с объектами Person с методами getName() и getYearOfBirth(). Я использую groupBy для группировки объектов Person, но я хочу только имена на карте, так как Person будет иметь много дополнительных полей в будущем. Годы будут ключами.

val people = List(
Person("Tom", 1985),
Person("Abigail", 1987),    
Person("Joyce", 1984),
Person("James", 1987),
Person("Scott", 1985),  
Person("Ruth", 1984)
)


var birthdayMap = people.groupBy(x=> x.getYearOfBirth()) // map to getName() ?

Ответы [ 2 ]

8 голосов
/ 03 марта 2012
scala> persons groupBy (_.year) mapValues (_ map (_.name))
res9: scala.collection.immutable.Map[Int,scala.collection.immutable.Set[String]] = Map(1984 -> Set(Joyce, Ruth), 1987 -> Set(James, Abigail), 1985 -> Set(Tom, Scott))
0 голосов
/ 02 октября 2018

Начиная с Scala 2.13, для большинства коллекций предоставляется метод groupMap , который эквивалентен groupBy, за которым следует mapValues:

people.groupMap(_.yearOfBirth)(_.name)
// Map[Int,List[String]] = Map(1985 -> List(Tom, Scott), 1984 -> List(Joyce, Ruth), 1987 -> List(Abigail, James))
// equivalent to people.groupBy(_.yearOfBirth).mapValues(_.map(_.name))

с учетом:

case class Person(name: String, yearOfBirth: Int)
val people = List(Person("Tom", 1985), Person("Abigail", 1987), Person("Joyce", 1984), Person("James", 1987), Person("Scott", 1985), Person("Ruth", 1984))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...