我已经使用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条线路到底在做什么,我真的很感激。
谢谢你们
答案 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系列是开始使用这些功能的好地方。