Коллекция / Массив содержит метод - PullRequest
5 голосов
/ 20 декабря 2011

Мне было интересно, есть ли метод для collection / array в EL 2.2 или мне придется сделать заказной?

ТРЕБОВАНИЕ : у меня есть строковый массив, и я хочу найти, содержит ли он определенную строку.

CASE : я зациклен на списке входных флажков , чтобы отобразить их, и я хочу проверить текущий флажок, если его значение существует в массиве флажков.

ОБНОВЛЕНИЕ :

  • такой метод доступен в EL?

  • Если такой метод недоступен, укажите, пожалуйста, лучший результат метод для строкового массива содержит элемент.

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

Для Collection это просто, просто используйте метод Colleciton#contains() в 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>

Для 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. Конкретный пример см. В Как создать пользовательскую функцию EL для вызова статического метода? Например.

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 значениях.

2 голосов
/ 26 апреля 2016

Если вы используете String[], вы можете сначала объединить все элементы массива в строку, используя fn:join():

<c:set var="concat" value="${fn:join(myArray, '-')}"/>

И затем использовать fn:contains() `функция для проверки, существует ли значение в этой строке:

<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if>
...