在 Java 中将枚举转换为映射

Posted

技术标签:

【中文标题】在 Java 中将枚举转换为映射【英文标题】:Convert Enumeration to a Map in Java 【发布时间】:2019-07-06 18:29:27 【问题描述】:

我正在我的代码中尝试使用以下表达式

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

如图here 但 Eclipse 抱怨类型不匹配:

实现此目的的正确方法是什么?为什么?为什么链接中的那个不使用任何强制转换?

更新:

考虑到@Eugene 的建议,以下怪物似乎让编译器更快乐:

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

也许在 Java 8 中有更简洁的表达方式?

【问题讨论】:

它的类型是org.eclipse.jetty.server.Request 应该是 request::getHeader 而不是 name -&gt; request.getHeader() 不知道。只是草率的第一次尝试让它快乐,也许有更好的方法? @Eugene no,request::getHeadername -&gt; request.getHeader(name) 的正确简写形式 虽然从正在使用哪些类的问题中并不清楚,但这个问题错过了一个关键标签 android,这就是 the implementation of getHeaderNames() 的不同之处。在我的回答(以前)中,我刚刚根据谷歌搜索的第一个选择了一个类,这也是最终错误地解释问题的地方。 【参考方案1】:

与@Eugene 的断言相反,这里的不同之处在于org.eclipse.jetty.server.Request.getHeaderNames()produces 和Enumeration&lt;Object&gt;,因此,被输入Collections.list() 会导致ArrayList&lt;Object&gt;,这就是Java 编译器没有不接受。

按照 IDE 的建议将最终结果转换为 (Map&lt;String, String&gt;) 可以减轻投诉:

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

显然,我提到的页面(here 和Servlet Filter: How to get all the headers from servletRequest?)使用原始方法,但最终没有将其转换为Map&lt;String, String&gt;,因此一开始就被破坏了(正如@Eugene 所建议的那样),或者由于其他一些晦涩的原因而工作。

也许有人可以解开这个谜团。

更新:

根据@StuartMarks 的评论提示进行进一步调查,罪魁祸首确实是所使用的 Jetty 版本。 Request.getHeaderNames() 在两者之间的实现方式不同。

版本 7.6.16(我们碰巧在使用)使用原始类型枚举,造成严重破坏:

而码头版。 9.4.7 使用类型化枚举:

它解释了为什么我在原始问题中引用的 article 和 the other SO mention 都是正确的 - 它们只是指该方法的新实现。再次感谢@StuartMarks 的指出。

【讨论】:

看起来您链接到的getheaderNames() 的Android 版本返回一个原始类型 Enumeration 而不是Enumeration&lt;Object&gt;。但效果是一样的;它会破坏类型推断,要求您在一个或另一个地方添加演员表才能使其工作。较新版本的 Jetty 返回 Enumeration&lt;String&gt;,这使得示例无需强制转换即可正常工作。 那么,使用(Enumeration&lt;String&gt;)request.getHeaderNames() 来执行整个流操作而不是转换最终结果会更简洁。 @StuartMarks 有趣,我会考虑升级我们的 Jetty jar,也许这会像你说的那样工作。 @Holger:确实,这比铸造最终结果和/或升级 Jetty jars 更清洁和更明显的选择

以上是关于在 Java 中将枚举转换为映射的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将字符串转换为枚举

如何在打字稿接口/类型中将枚举值类型转换为数组?

在 C# 中将 Int 转换为通用枚举

将枚举转换为集/列表

无法在通用方法中将整数转换为枚举 [重复]

在Angular 6模板语句中将字符串转换为Typescript枚举