当前位置: 首页 > 面试题库 >

Freemarker:如何使用枚举作为键遍历Map

冯良才
2023-03-14
问题内容

以下代码不起作用,因为Freemarker似乎将[]中的表达式的值强制转换为String,然后将其用作键,这并不是实际期望的值。

准备模板模型:

Map<MyEnum, Object> myMap;
myMap.put(MyEnum.FOO, "Foo");
myMap.put(MyEnum.BAR, "Bar");
templateModel.put("myMap", myMap);

my.ftl:

<#list myMap?keys as key>
    <#assign value = myMap[key]>
    <li>${key} = ${value}</li>
</#list>

在Freemarker文档中,描述了如何访问Enum本身,但是我没有找到有关如何使用Enum作为键从哈希中获取值的任何信息。

谢谢。


问题答案:

要对此释义Freemarker文档常见问题,

您不能在myMap [key]表达式中使用非字符串键。您可以使用方法!

因此,您可以创建一个bean,为您提供一种到达Java EnumMap的方法。然后只需使用您的mapp实例化该bean,然后将该bean放入模型中。

class EnumMap
{
    HashMap<MyEnum, String> map = new HashMap<MyEnum, String>();

    public String getValue(MyEnum e)
    {
        return map.get(e);
    }    
    ..constructor, generics, getters, setters left out.
}

对于您要实现的总体目标,我有些困惑。如果您只需要列出枚举的值(或者每个值的显示值)。有一种更简单的方法可以做到这一点。

我看到解决此问题的一种方法是将显示值放在Enum实例上。

enum MyEnum 
{   FOO("Foo"), 
    BAR_EXAMPLE("Bar Example"); 
    private String displayValue;

    MyEnum(String displayValue)
    {
        this.displayValue = displayValue;
    }

    public String getDisplay()
    {
        return displayValue;
    }
}

这使您可以将Enum本身放入配置中,并遍历所有实例。

SimpleHash globalModel = new SimpleHash();
TemplateHashModel enumModels = BeansWrapper.getDefaultInstance().getEnumModels();
TemplateHashModel myEnumModel = (TemplateHashModel) enumModels.get("your.fully.qualified.enum.MyEnum");

globalModel.put("MyEnum", myEnumModel);
freemarkerConfiguration.setAllSharedVariables(globalModel);

然后您可以遍历枚举,

<#list MyEnum?values as item>
    ${item.display}
</#list>


 类似资料:
  • 问题内容: 我有一个如下的JavaScript对象: 现在我想通过所有回路元素(,,…),并得到他们的键和值。我怎样才能做到这一点? 我可以根据需要修改JavaScript对象。我的最终目标是遍历一些键值对,如果可能的话,我想避免使用。 问题答案: 您可以使用其他人所示的循环。但是,您还必须确保获得的键是对象的实际属性,而不是来自原型。 这是代码段: 用Object.keys()替代: 请注意,使

  • 我的Flutter项目中有一个Dart枚举,如下所示: 如果我有一些随机枚举状态,如,我如何迭代到下一个枚举(而不需要做一些事情,如用开关语句映射它们)? 我在这个,这个和这个的帮助下找到了答案,所以我把它贴在下面。

  • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作:

  • 我有一个简单的枚举,我想迭代一下。为此,我采用了顺序和迭代器协议,如下面的代码所示。顺便说一句,这可以复制/粘贴到Xcode 8中的游乐场。 但是for in循环生成错误消息“Type”节。Type不符合协议“Sequence”。协议一致性在我的扩展中;那么,这个代码有什么问题? 我知道还有其他方法可以做到这一点,但我想知道这种方法有什么问题。 谢谢

  • 运行此代码时: 引发异常: 系统。无效操作异常:集合被修改;枚举操作可能无法执行。 怎么做。NET知道该集合在枚举器迭代该集合时被修改了吗?集合对象中是否有此标志?

  • 问题内容: 我有以下LinkedHashMap声明。 我的观点是如何遍历此哈希图。我要执行以下操作,对于每个键,获取对应的arraylist并针对该键逐一打印arraylist的值。 我试过,但 得到 只返回字符串, 问题答案: 顺便说一句,您应该真正将变量声明为接口类型,例如。