i was wondering if there's contains method for collections/array in EL 2.2
or i will have to make a custom one ?
REQUIREMENT: i have a string array, and i want to find if it contains a specific string.
CASE: i am looping on list of input checkboxes to render them, and i want to check the current checkbox, if it's value exists in the array of checkboxes.
UPDATE:
is such method is available in EL?
If such method is not available, then please provide your suggestion for best performance method for a string array contains an element.
For a Collection
it's easy, just use the Colleciton#contains()
method in EL.
<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>
For an Object[]
(array), you'd need a minimum of EL 3.0 and utilize its new Lambda support.
<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>
If you're not on EL 3.0 yet, you'd need to create a custom EL function. For a concrete example, see 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);
}
which is registered as
<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>
and to be used as
<h:panelGroup ... rendered="#{func:contains(bean.panels, 'u1')}">
This is not available in JSTL. There's a fn:contains()
, but that works on String
values only.
If you are using a String[]
, you can first concatenate all the elements of an array into a string using fn:join()
:
<c:set var="concat" value="${fn:join(myArray, '-')}"/>
And then use the fn:contains()
` function in order to check if a value exists in that string:
<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if>