假设我在freemarker变量中有一些对象container
,container.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
方法只返回名称。我想保留用于调试目的的详细表示。
答案 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(", ")}