Коллекция / массив содержит метод

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

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

СЛУЧАЙ: я просматриваю список флажков ввода, чтобы отобразить их, и хочу проверить текущий флажок, если его значение существует в массиве флажков.

ОБНОВЛЕНИЕ:

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

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


person Mahmoud Saleh    schedule 20.12.2011    source источник


Ответы (2)


Для 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.

person BalusC    schedule 20.12.2011
comment
Просто не используйте массивы, если вы хотите немного больше, чем просто хранить данные. Тогда используйте коллекции. - person BalusC; 20.12.2011
comment
ну, я использую его для входного атрибута, но метод не вызывается: checked="#{utils.contains(myBean.array,'myBean.someIndicator') ? 'checked' : ''}" - person Mahmoud Saleh; 20.12.2011
comment
Есть ли ошибки EL? Кстати, способ использования checked не совсем правильный. Флажок / радиокнопка устанавливается, когда присутствует весь атрибут, независимо от его значения. Вы в основном хотите вывести имя атрибута вместо значения атрибута условно. - person BalusC; 20.12.2011
comment
ага, понял, и нет, я не вижу ошибок EL, разве не должно возникать исключение, если есть ошибка EL? - person Mahmoud Saleh; 20.12.2011
comment
О, я вижу, вы используете . вместо :. Поскольку #{utils} не существует как управляемый компонент, ничего не произойдет. Для вызова функций вместо #{prefix:functionName()} нужно использовать :. - person BalusC; 20.12.2011
comment
вышеупомянутый метод не работает так хорошо, когда значение ввода - int. - person Mahmoud Saleh; 21.12.2011
comment
это означает, что если значение равно 1 вместо u1, в этом случае равенство не выполняется. - person Mahmoud Saleh; 21.12.2011
comment
Мне нужно преобразовать элемент в строку, прежде чем сравнивать, чтобы работать нормально, но я боюсь, что это может вызвать проблемы с большими числами. - person Mahmoud Saleh; 21.12.2011
comment
Просто используйте вместо этого Integer или измените метод, чтобы перебирать массив вместо преобразования int[] в List<int> (что недопустимо). - person BalusC; 21.12.2011

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

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

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

<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if>
person Sergio Ortega    schedule 26.04.2016
comment
Это простое решение помогло мне, так как я хотел проверить ${ param.stringArray } значений флажков. - person ruhong; 27.09.2016