Collection/Array包含方法

Mah*_*leh 5 arrays collections jsf contains el

我想知道在EL 2.2中是否包含集合/数组的方法,或者我必须自定义一个?

要求:我有一个字符串数组,我想找到它是否包含一个特定的字符串.

情况:我正在循环输入复选框列表来渲染它们,我想检查当前复选框,如果它的值存在于复选框数组中.

更新:

  • EL有这样的方法吗?

  • 如果此方法不可用,那么请提供您的建议,以获得包含元素的字符串数组的最佳性能方法.

Bal*_*usC 7

为了Collection方便起见,只需使用Colleciton#contains()EL中的方法即可.

<h:panelGroup id="p1" rendered="#{bean.panels.contains('p1')}">...</h:panelGroup>
<h:panelGroup id="p2" rendered="#{bean.panels.contains('p2')}">...</h:panelGroup>
<h:panelGroup id="p3" rendered="#{bean.panels.contains('p3')}">...</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

对于Object[](数组),您至少需要EL 3.0并使用其新的Lambda支持.

<h:panelGroup id="p1" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p1').get()}">...</h:panelGroup>
<h:panelGroup id="p2" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p2').get()}">...</h:panelGroup>
<h:panelGroup id="p3" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p3').get()}">...</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

如果您还没有使用EL 3.0,则需要创建自定义EL功能.有关具体示例,请参阅如何创建自定义EL函数以调用静态方法?例如

public static boolean contains(Object[] array, Object item) {
    return Arrays.asList(array).contains(item);
}
Run Code Online (Sandbox Code Playgroud)

注册为

<function>
    <function-name>contains</function-name>
    <function-class>com.example.Functions</function-class>
    <function-signature>boolean contains(java.lang.Object[], java.lang.Object)</function-signature>
</function>
Run Code Online (Sandbox Code Playgroud)

并用作

<h:panelGroup ... rendered="#{func:contains(bean.panels, 'u1')}">
Run Code Online (Sandbox Code Playgroud)

这在JSTL中不可用.有一个fn:contains(),但String只适用于价值观.