Как оставаться верным функциональному стилю в Scala для выражений

Я изо всех сил пытался найти способ сохранить верность функциональному стилю в выражениях, когда мне нужно собрать несколько параметров объекта в список.

В качестве примера предположим, что у меня есть объект уведомления, который имеет как fromId (идентификатор пользователя, от которого отправлено уведомление), так и objectOwnerId (идентификатор пользователя, создавшего исходный объект). Они могут отличаться уведомлениями в стиле facebook («X также прокомментировал сообщение Y»).

Я могу собрать идентификаторы пользователей с помощью выражения for, подобного такому

val userIds = for { notification <- notifications } yield notification.fromId

, однако скажу, что я хочу собрать идентификаторы fromIds и objectOwnerIds в один список, есть ли способ сделать это в одном выражении for без пользователя vars?

Я делал что-то подобное в прошлом:

var ids = List()
for {
    notification <- notifications
    ids = ids ++ List(notification.fromId, notification.objectOwnerId)
}
ids = ids.distinct

но мне кажется, что должен быть способ получше. Использование var и необходимость вызывать отличное после того, как я завершу сбор, уродливы. Я мог бы избежать отдельного с помощью некоторых условных выражений, но я пытаюсь изучить правильные функциональные методы, чтобы делать что-то.

Заранее благодарим за любую помощь!

5
задан Kareem 31 December 2011 в 19:20
поделиться