He luchado para encontrar una forma de mantenerme fiel al estilo funcional en expresiones cuando necesito recopilar múltiples parámetros de un objeto en una lista.Cómo mantenerme fiel al estilo funcional en Scala para expresiones
Como ejemplo, digamos que tengo un objeto de notificación, que tiene un fromId (el ID de usuario de la notificación es) y un objectOwnerId (el id del usuario que creó el objeto original). Estos pueden diferir en las notificaciones de estilo de Facebook ("X también comentó en la publicación de Y").
puedo recoger los userIds con una expresión como tal
val userIds = for { notification <- notifications } yield notification.fromId
sin embargo digo que quiero para recoger tanto los fromIds y los objectOwnerIds en una sola lista, ¿hay alguna manera de hacer esto en una sola de expresión sin el usuario de vars?
que he hecho algo como esto en el pasado:
var ids = List()
for {
notification <- notifications
ids = ids ++ List(notification.fromId, notification.objectOwnerId)
}
ids = ids.distinct
pero se siente como que debe haber una mejor manera. El uso de una var y la necesidad de llamar distinct después de completar la colección son desagradables. Podría evitar lo distinto con algunos condicionales, pero estoy tratando de aprender los métodos funcionales adecuados para hacer las cosas.
¡Gracias de antemano por cualquier ayuda!
Creo que la pregunta real es, "cómo asignar de [Y (x1, x2), Y (x3, x4)] a [x1, x2, x3, x4]? " que a veces se llama "flatMap". –
@pst suponiendo que no hay forma de obtener una sola lista sin el uso de var, entonces sí, esa es la pregunta. – Kareem
La 'var'/mutación es ortogonal en este caso. –