集合/数组包含方法

Posted

技术标签:

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

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

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

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

更新

EL 有这种方法吗?

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

【问题讨论】:

【参考方案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 的复选框值。

以上是关于集合/数组包含方法的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中数组的集合和映射

集合 和 数组 的区别

对象集合属性和方法

集合的概述

Collection集合

Spring中使用MapSetList数组属性集合的注入方法配置文件