Play框架Scala模板

4

我已经使用Play框架一段时间了,但是对于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>
}

这三行文字真的让我很困惑:
@todoTasks.groupBy(_.project).map {

case (project, tasks) => {

@tasks.map { task =>

如果有人能够详细解释一下这3行代码的作用,我将不胜感激。

谢谢大家。

2个回答

2

好的,这里涉及到几个转换。

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

.map { case (project, tasks) => { 表示现在我们有了一个 Map,其中键是 project,值是 tasks 的列表。如果我们有这两个项(project、tasks),那么我们应该对每个任务做一些事情,这些事情就是跟在 => 后面的内容。

提示:你不需要深入了解 Scala 就能成为 Java Play 开发人员,只需在 Java 控制器中对数据进行转换即可。


谢谢Alex的回复,这就是我一直在做的事情,在Java控制器中进行转换。我想也许深入了解Scala会很棒。 - Siavosh
@Siavash,如果你要在严肃的开发中使用Play框架,我认为学习Scala是值得的。首先,Play框架中的构建工具(sbt)是用Scala编写的。其次,你会发现使用Scala版本的代码更加紧凑和表达力强。我建议你去看一下Coursera上的Scala课程,非常好。它刚刚开始,所以如果你现在开始学习,就不会错过任何内容。https://www.coursera.org/course/progfun - Alex

1

我认为这些内容并不特定于Play模板,而是典型的函数式Scala示例。中间的一行使用匿名函数进行模式匹配,这在这个教程中有很好的介绍。其他两个示例调用了接受函数本身作为参数的集合函数。这些被称为“高阶函数”,是函数式编程的关键工具之一。.map特别重要。Daniel Spiewak的Scala Collections For The Easily Bored系列是学习此类函数的好地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接