【发布时间】:2011-12-31 19:20:01
【问题描述】:
当我需要将对象的多个参数收集到列表中时,我一直在努力寻找一种方法来保持表达式中的函数式风格。
例如,假设我有一个 Notification 对象,它同时具有 fromId(通知来自的用户 ID)和 objectOwnerId(创建原始对象的用户的 ID)。这些在 facebook 样式通知中可能有所不同(“X 还评论了 Y 的帖子”)。
我可以用这样的 for 表达式收集用户 ID
val userIds = for { notification <- notifications } yield notification.fromId
但是说我想将 fromIds 和 objectOwnerIds 收集到一个列表中,有没有办法在没有 vars 用户的情况下在单个 for 表达式中执行此操作?
我过去做过这样的事情:
var ids = List()
for {
notification <- notifications
ids = ids ++ List(notification.fromId, notification.objectOwnerId)
}
ids = ids.distinct
但感觉必须有更好的方法。 var 的使用,以及在我完成集合后需要调用 distinct 都很难看。我可以通过一些条件来避免不同,但我正在尝试学习正确的函数方法来做事。
提前感谢您的帮助!
【问题讨论】:
-
我认为真正的问题是,“如何从 [Y(x1, x2), Y(x3, x4)] 映射到 [x1,x2,x3,x4]?有时称为“平面地图”。
-
@pst 假设不使用 var 就无法获得单个列表,那么是的,这就是问题所在。
-
var/mutation 在这种情况下是正交的。 -
@pst 你能澄清一下这是什么意思吗?我对 scala 很陌生。
-
有一种方法可以在没有
var/mutation 的情况下获得这样的列表。flatMap操作是如何字面上进行请求的转换。基本问题是相同的,无论初始假设如何(如果没有var/mutations 就无法执行操作),这就是为什么它(问题)与此类假设正交.. 尽管这可能是一个不好用的术语在这里。
标签: list scala functional-programming for-loop