播放框架Scala模板

时间:2013-09-17 21:14:22

标签: scala templates playframework playframework-2.0

我已经使用Play Framework了一段时间,但我几乎是Scala模板的新手 。对于我来说,作为C熟悉的语言开发人员,有时看起来有点奇怪

我想知道这里是否有人可以帮助我更好地理解这段代码 http://www.playframework.com/documentation/2.2.x/JavaGuide3 (Zentask示例)

@(projects: List[Project], todoTasks: List[Task])

@main("Welcome to Play") {

    <header>
        <hgroup>
            <h1>Dashboard</h1>
            <h2>Tasks over all projects</h2>
        </hgroup>
    </header>

    <article  class="tasks">
        @todoTasks.groupBy(_.project).map {
            case (project, tasks) => {
                <div class="folder" data-folder-id="@project.id">
                    <header>
                        <h3>@project.name</h3>
                    </header>
                    <ul class="list">
                        @tasks.map { task =>
                            <li data-task-id="@task.id">
                                <h4>@task.title</h4>
                                @if(task.dueDate != null) {
                                    <time datetime="@task.dueDate">
                                        @task.dueDate.format("MMM dd yyyy")</time>
                                }

                                @if(task.assignedTo != null && task.assignedTo.email != null) {
                                    <span class="assignedTo">@task.assignedTo.email</span>
                                }
                            </li>
                        }
                    </ul>
                </div>
            }
        }
    </article>
}

这3行对我来说真的很混乱:

@todoTasks.groupBy(_.project).map {

case (project, tasks) => {

@tasks.map { task =>

如果有人能够更详细地向我解释这3条线路到底在做什么,我真的很感激。

谢谢你们

2 个答案:

答案 0 :(得分:2)

好的,所以这里有几个转换。

@todoTasks.groupBy(_.project)表示todoTask有一个名为project的字段,我们应该将todoTasks列表转换为一个Map,其中项目是键,值是与键匹配的所有todoTasks。

.map { case (project, tasks) => {表示我们现在有一个地图,其中密钥为project,值为tasks的列表。如果我们有这两个项目(项目,任务),那么我们应该对每个任务做一些事情,那就是=>

之后的事情。

提示,作为一名java play开发人员,您不需要深入了解scala,只需对java控制器中的数据进行转换即可。

答案 1 :(得分:1)

我认为这些都不是Play模板特有的,而是惯用的功能Scala的例子。中间行使用模式匹配与匿名函数,this tutorial非常好地涵盖了它。另外两个是在集合上调用函数,它们将函数本身作为参数。这些被称为“高阶函数”,是函数式编程的关键工具之一。特别是.map是FP的关键。 Daniel Spiewak的Scala Collections For The Easily Bored系列是开始使用这些功能的好地方。