如何对Freemarker序列进行投影以提取属性?

时间:2016-04-04 10:56:33

标签: freemarker

假设我在freemarker变量中有一些对象containercontainer.content给我一系列对象(我称之为“东西”),其名称和String getName()访问者。我想从container.content序列生成以逗号分隔的名称列表。

如果我已经有了一系列名称而不是一系列带名字的东西,我可以简单地做names?join(", ")。是否有一些简洁的东西从.name中提取container.content - 并在之后加入它们?更一般地说,我正在寻找一个函数式编程映射(收集,投影)操作,但在文档中找不到。

我现在尝试过:

目前,我有<#list container.content as x>${x.name}<#if x?has_next>, </#if></#list>来重现map-then-join操作,但我觉得相当冗长,基本上重新实现join看起来像是一种气味。

以前我有container.content?join(", "),我当然得到"Thing[name=A, otherStuff=...], Thing[name=B, otherStuff=...]"而不是"A, B"。我不希望修改Thing#toString方法只返回名称。我想保留用于调试目的的详细表示。

1 个答案:

答案 0 :(得分:0)

您可以创建将从输入序列中提取键值的函数:

<#function map seq key>
    <#assign result = []>
    <#list seq as item>
        <#assign result = result + [item[key]]>
   </#list>
  <#return result>
</#function>

然后像这样使用它:

${map(container.content, "name")?join(", ")}