应用多个过滤条件并仅从列表中生成一个元素

时间:2016-08-26 11:02:30

标签: scala

说例如

scala> case class Entitlement(read: Boolean, edit: Boolean, create: Boolean, delete: Boolean)
defined class Entitlement

scala> List (Entitlement(read= true, edit = true, create= false, delete =false),Entitlement(read= true, edit = false, create= false, delete =false),Entitlement(read= true, edit = true, create= false, delete =true))
res0: List[Entitlement] = List(Entitlement(true,true,false,false), 
Entitlement(true,false,false,false), Entitlement(true,true,false,true))

有没有办法通过列表Entitlement(true,true,false,true)的单次传递创建一个res0只有read=true,这样它就可以通过列表,如果read找到了&else default value for read=false #39; s最终的edit=true权限edit - 如果else default value for edit=false发现最后的create=false权限Entitlement,依此类推。在List中所有Entitlement(true,true,false,true) 元素的玩具示例revision中,为什么最终结果将是

revision

2 个答案:

答案 0 :(得分:3)

您可以将列表和or折叠为Entitlement的相应值。您从Entitlement开始,所有值都设置为false。

res0.fold(Entitlement(false, false, false, false))((e1, e2) => 
    Entitlement(
        e1.read || e2.read, 
        e1.edit || e2.edit, 
        e1.create || e.create,
        e1.delete || e2.delete))

答案 1 :(得分:0)

你也可以通过减少来实现同样的目标。以下是一个例子。这里的优点是您不需要传递初始值,而且更直观。

res0.reduce((e1, e2) => Entitlement(e1.read | e2.read, e1.edit | e2.edit, e1.create | e2.create, e1.delete | e2.delete))