Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Collection/Array contains method

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.

like image 442
Mahmoud Saleh Avatar asked Dec 20 '11 14:12

Mahmoud Saleh


2 Answers

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.

like image 104
BalusC Avatar answered Sep 19 '22 07:09

BalusC


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>
like image 43
Sergio Ortega Avatar answered Sep 21 '22 07:09

Sergio Ortega