迭代具有非字符串键对和 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
值
我正在通过 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
值