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

Iterating HashMap that has a non-string key-pair and ArrayList as a value

我正在通过 Controller 传递以下内容:

HashMap<SomeClassA, ArrayList<SomeClassB>>

SomeClassA和SomeClassB不是原语,是我自己编码的。他们的 getters 要么是 Strings 要么是 Longs。让我们将 HashMap 变量称为 map123.

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

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

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

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

这很容易成为 FreeMarker 2 中最有问题的遗留问题,但它有解决方法。 [] 运算符不支持 non-string 键。这将是一个错误,但由于与另一个遗产的不幸合作,通常会发生查找是用对象的 toString() 静默完成的,所以你根本找不到该项目。

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

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

如果您必须以其他方式按键获取值,那么您可以回退到 Map 的 Java API:map123?api.get(key)。 (请注意,?api 必须在 FreeMarker 配置中显式启用,但错误消息会说明这一点。)

如果您不能使用 key-value 对(自 2.3.25 起)

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

你可以试试

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

您可以使用 ?exists 指令或 ${entry.value!"default"}

轻松检查 null