【问题标题】:Collection/Array contains method集合/数组包含方法
【发布时间】:2012-01-24 11:58:12
【问题描述】:

我想知道 EL 2.2 中是否有用于 collections/array 的 contains 方法 还是我必须定制一个?

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

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

更新

  • EL 有这种方法吗?

  • 如果这样的方法不可用,那么请提供您对字符串数组包含元素的最佳性能方法的建议。

【问题讨论】:

    标签: arrays jsf collections el contains


    【解决方案1】:

    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? E.g.

    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' : ''}"
    • 是否有任何 EL 错误?顺便说一句,您使用checked 的方式并不完全正确。当整个属性存在时,无论其值如何,都会检查复选框/单选按钮。您基本上想有条件地打印属性名称而不是属性值。
    • 啊哈,知道了,不,我看不到 EL 错误,如果出现 EL 错误,不应该抛出异常吗?
    • 改用Integer或者修改方法循环遍历数组,而不是将int[]转换为List&lt;int&gt;(无效)。
    【解决方案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 } 的复选框值。
    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2011-12-04
    • 2012-07-27
    相关资源
    最近更新 更多