4

我使用 Play Framework 已经有一段时间了,但我对 Scala Templates 几乎是新手。对于我作为一个熟悉 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 行到底在做什么,我将不胜感激?

多谢你们

4

2 回答 2

2

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

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

.map { case (project, tasks) => {表示我们现在有一个 Map,其中键是project,值是tasks. 如果我们有这两个项目(项目、任务),那么我们应该对每个任务做一些事情,事情就是遵循=>

提示,作为一个 java play 开发者,你不需要对 scala 有深入的了解,只需在你的 java 控制器中转换数据即可。

于 2013-09-18T06:20:01.537 回答
1

我认为这些根本不是 Play 模板特有的,而是惯用的函数式 Scala 的示例。中间行使用带有匿名函数的模式匹配,本教程很好地介绍了这一点。另外两个是在将函数本身作为参数的集合上调用函数。这些被称为“高阶函数”,是函数式编程的关键工具之一。.map 尤其是 FP 的关键。Daniel Spiewak 的Scala Collections For The Easy Bored系列是开始使用这些函数的好地方。

于 2013-09-17T21:31:31.780 回答