集合/数组包含方法
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<int>
(无效)。【参考方案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
的复选框值。以上是关于集合/数组包含方法的主要内容,如果未能解决你的问题,请参考以下文章