Преобразовать перечисление в карту в Java - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь в своем коде использовать следующее выражение

    Map<String, String> headersMap =
             Collections.list(request.getHeaderNames())
        .stream()
        .collect(Collectors.toMap(
            name -> name,
            request::getHeader));

, как показано здесь , но Eclipse жалуется на несоответствие типов:

enter image description here

Как правильно это сделать и почему?Почему тот, кто находится в ссылке, не использует кастинг?

ОБНОВЛЕНИЯ:

Учитывая предложение @Eugene, следующее уродство, кажется, делает компилятор счастливее:

Map<String, String> headersMap = new HashMap<>();
 Collections.list(request.getHeaderNames())
 .forEach(x -> headersMap.put((String)x, (String)request.getHeader((String)x)));

Возможно, есть более сжатые способы выразить это в Java 8?

1 Ответ

0 голосов
/ 13 февраля 2019

Вопреки утверждениям @ Евгения, разница здесь в том, что org.eclipse.jetty.server.Request.getHeaderNames() производит Enumeration<Object>, что, следовательно, при подаче в Collections.list() приводит к ArrayList<Object>, что являетсяПричина, по которой компилятор Java не принимает это.

Приведение конечного результата к (Map<String, String>), как предлагает IDE, облегчает жалобу:

Map<String, String> headersMap =
 (Map<String, String>)
 Collections.list(request.getHeaderNames())
       .stream()
       .collect(Collectors.toMap(
                name -> name,
                request::getHeader));

Видимо, страницы, которые я упомянул ( здесь и Фильтр сервлетов: Как получить все заголовки из servletRequest? ), использующие оригинальный метод, без приведения его к Map<String, String>, прерываются для начала (как предложено @Eugene) или работают по какой-то другой непонятной причине.

Возможно, кто-то может пролить свет на эту тайну.

ОБНОВЛЕНИЯ:

При дальнейшем расследовании, как подсказано комментарием @ StuartMarks, действительно виновником являетсяверсия Jetty используется.Request.getHeaderNames () реализован по-разному между двумя.

Версия 7.6.16 (которую мы использовали) использует перечисление в необработанном виде, вызывая хаос:

enter image description here

, тогда какПричал вер.9.4.7 использует типизированное перечисление:

enter image description here

Это объясняет, почему статья , на которую я ссылался в исходном вопросе, а также другие SO упоминания являются правильными - они просто ссылаются на новую реализацию этого метода.Еще раз спасибо @StuartMarks за указание на это.

...