Collection / Array包含方法

时间:2011-12-20 14:19:33

标签: arrays jsf collections el contains

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

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

CASE :我在输入复选框列表上循环以渲染它们,我想检查当前复选框,如果它的值存在于复选框数组中。

更新

  • 这种方法在EL?

  • 中可用
  • 如果此方法不可用,请为包含元素的字符串数组提供最佳性能方法的建议。

2 个答案:

答案 0 :(得分:6)

对于Collection来说,这很简单,只需在EL中使用Colleciton#contains()方法即可。

<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>

对于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>

如果您还没有使用EL 3.0,则需要创建自定义EL功能。有关具体示例,请参阅How to create a custom EL function to invoke a static method?例如

public static boolean contains(Object[] array, Object item) {
    return Arrays.asList(array).contains(item);
}

注册为

<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>

并用作

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

这在JSTL中不可用。有一个fn:contains(),但仅适用于String值。

答案 1 :(得分:2)

如果您使用的是String[],则可以先使用fn:join()将数组的所有元素连接成一个字符串:

<c:set var="concat" value="${fn:join(myArray, '-')}"/>

然后使用fn:contains()`函数来检查该字符串中是否存在值:

<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if>