集合/数组包含方法

5
我想知道在EL 2.2中是否有用于集合/数组的contains方法,或者我需要自己编写一个自定义方法?
要求:我有一个字符串数组,并且我想查找它是否包含特定的字符串。
场景:我正在遍历输入复选框列表以呈现它们,并且我想检查当前复选框是否存在于复选框数组中。
更新:
- 在EL中是否有这样的方法可用? - 如果没有这样的方法可用,请提供建议以实现字符串数组包含元素的最佳性能方法。
2个回答

8

对于一个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函数。具体示例,请参见如何创建自定义EL函数以调用静态方法?例如:

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


嗯,我在一个输入属性上使用它,但是方法没有被调用:checked="#{utils.contains(myBean.array,'myBean.someIndicator') ? 'checked' : ''}" - Mahmoud Saleh
有任何EL错误吗?顺便说一下,您使用checked的方式并不完全正确。当整个属性存在时,复选框/单选按钮被选中,而不考虑其值。您基本上想有条件地打印属性名称而不是属性值。 - BalusC
啊哈,抓到你了。不过我看不到EL错误,如果有EL错误,难道不应该抛出异常吗? - Mahmoud Saleh
当输入的值为整数时,上述方法效果不佳。 - Mahmoud Saleh
1
只需使用 Integer,或修改方法以循环遍历数组,而不是将 int[] 转换为无效的 List<int> - BalusC
显示剩余4条评论

2
如果您正在使用String[],您可以首先使用fn:join()将数组的所有元素连接成一个字符串:
<c:set var="concat" value="${fn:join(myArray, '-')}"/>

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

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

这个简单的解决方案对我很有帮助,因为我想检查一个 ${ param.stringArray } 复选框值的数组。 - ruhong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接