Как я могу использовать Collectors #, присоединяющийся в EL Stream API? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь напечатать в JSP содержимое списка в виде одной строки, разделенной запятыми.

<div>${myList.stream().map(e->e.getStringValue()).collect(Collectors.joining(", "))}</div>

Я получаю сообщение об ошибке:

javax.el.MethodNotFoundException: Method not found: class org.apache.el.stream.Stream.collect(null)

ПочемуTomcat использует собственную версию Stream?Есть ли способ избежать этого и убедиться, что то, что я пишу в моих классах Java, будет иметь такое же поведение, когда я помещу их в EL в JSP?

Я нашел этот ответ https://stackoverflow.com/a/42930628/2761418 Ноэто не решает мою проблему.Он использует пользовательский метод Tomcat Streams.

1 Ответ

4 голосов
/ 09 апреля 2019

EL Stream API не привязан к Java 8 Stream API.EL Stream API - это полностью автономный API, который был изначально разработан для Java EE 7 и привязан к Java 7. Обратите внимание, что это действительно означает, что вам совсем не нужна Java 8 при использовании EL Stream API, он уже будет работатьв Java 7.

Исторически лидеры спецификации EL пытались разработать интерфейс EL Stream API настолько близким к предложению Java 8 Stream API, насколько это было известно в то время.К сожалению, среди прочего EL Stream#join() проскользнул, потому что Collectors#joining() был добавлен только позже.

В любом случае вы не можете использовать какие-либо функции Stream API Java 8, такие как Collectors#xxx(), в методах EL Stream.Как уже говорилось, API EL Stream полностью автономен.Для сбора EL-потока доступны только методы Stream#toArray(), Stream#toList() и Stream#reduce().См. Также главу " Операции над объектами коллекции " в руководстве по Java EE и главу 2.3 "Операции с коллекциями" спецификации EL 3.0 .

Итак, в API EL StreamЛучшая ставка для сбора потока путем объединения строк или любого другого пользовательского коллектора - использовать Stream#reduce().Ниже приведен пример для вашего конкретного случая:

<div>${myList.stream().map(e -> e.stringValue).reduce((l, r) -> l += ', ' += r).get()}</div>

Обратите внимание, что я воспользовался возможностью, чтобы упростить ${e.getStringValue()} до ${e.stringValue}, так как оно в основном представляет свойство компонента в EL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...