迭代具有非字符串键对和ArrayList值为

时间:2017-01-23 20:05:43

标签: arraylist hashmap iterator iteration freemarker

我通过Controller传递以下内容:

HashMap<SomeClassA, ArrayList<SomeClassB>>

SomeClassA和SomeClassB不是原语,由我编码。他们的吸气剂是Strings或Longs。让我们调用HashMap变量map123

我想要做的就是有这样的代码:

<#list map123?keys as key> 
    ${key} = ${map123[key]} 
</#list> 

然而,我得到的是map123 [key]是一个NULL! 这意味着我无法迭代ArrayList。

我做错了什么(或者我应该做什么)?

2 个答案:

答案 0 :(得分:1)

这很容易成为FreeMarker 2中最成问题的遗产,但它有解决方法。 []运算符不支持非字符串键。这将是一个错误,但由于与另一个遗产的不幸合作,通常会发生的事情是查找是使用对象的toString()静默完成的,因此您根本找不到该项。

解决方法:如果您只需要迭代,只需使用至少版本2.3.25-incubating(这是一个稳定的最终版本)并写下:

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

如果必须按键获取值,则可以回退到Mapmap123?api.get(key)的Java API。 (请注意,必须在FreeMarker配置中明确启用?api,但错误消息会告诉您。)

答案 1 :(得分:1)

如果您不能使用键值对(自2.3.25开始)

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

你可以尝试

<#list map123.entrySet() as entry >
    ${entry.key} = ${entry.value}
</#list>

您可以使用null指令或仅?exists

轻松检查${entry.value!"default"}