比较Play Framework模板中的三个Scala列表

时间:2017-06-12 12:52:36

标签: scala list playframework

我正在尝试过滤三个对象列表并将它们循环输出,我使用PlayFramework,我在后端运行Java,我只在前端使用Scala模板。

我们假设以下内容: 我现在有3个列表:AListBListCList 列表A和C没有任何共同之处,但列表B是中间的链接列表,它充当连接。列表C包含具有两个属性的对象:idAidC。现在我想接收来自AList的所有对象,如果BList中存在ID,我想显示来自CList的其他信息。我真的不知道如何在scala中处理这个问题。我读了一些关于压缩列表的线程,并提出了这样的方法:

@listCheckA = @{
    AList.map(a => (a,  BList.map(_.idA).contains(a.idA)))
}
@listCheckC = @{
    CList.map(c => (c, BList.map(_.idC).contains(c.idC)))
}
@listLinked = @{
    listCheckA.zip(listCheckC).map( ??? )
}

之后我想输出带有for循环的对象。 如果这可能是一种合法的方法,我应该在listLinked做什么来检查我的条件?

很抱歉,如果这个问题听起来很愚蠢,我以前几乎不会使用Scala。

提前致谢!

1 个答案:

答案 0 :(得分:1)

首先,这看起来很像一个多对五的链接表,你应该可以使用你的数据库库来处理,比如

SELECT a.*, c.* FROM TableA as a, TableB as b, TableC as c WHERE a.idA = b.idA AND c.idC = b.idC`

如果你真的需要使用scala(正如我在你之前的帖子中所说的,逻辑不应该在模板中,而是在你的控制器中),你可以将其作为理解来实现:

@for {
  a <- AList
  b <- BList if b.aid == a.aid
  c <- CList if c.cid == b.cid
} {
  // ... do whatever you want with a and b and c here ...
}

这与另外三个for循环相同,除了if语句将执行它所说的内容(过滤满足谓词的元素)。

除非您使用上述SQL语句直接在数据库中查询,否则您会发现很难更有效地执行此操作。