在 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 -> request.getHeader()
不知道。只是草率的第一次尝试让它快乐,也许有更好的方法?
@Eugene no,request::getHeader
是 name -> request.getHeader(name)
的正确简写形式
虽然从正在使用哪些类的问题中并不清楚,但这个问题错过了一个关键标签 android,这就是 the implementation of getHeaderNames()
的不同之处。在我的回答(以前)中,我刚刚根据谷歌搜索的第一个选择了一个类,这也是最终错误地解释问题的地方。
【参考方案1】:
与@Eugene 的断言相反,这里的不同之处在于org.eclipse.jetty.server.Request.getHeaderNames()
produces 和Enumeration<Object>
,因此,被输入Collections.list()
会导致ArrayList<Object>
,这就是Java 编译器没有不接受。
按照 IDE 的建议将最终结果转换为 (Map<String, String>)
可以减轻投诉:
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<String, String>
,因此一开始就被破坏了(正如@Eugene 所建议的那样),或者由于其他一些晦涩的原因而工作。
也许有人可以解开这个谜团。
更新:
根据@StuartMarks 的评论提示进行进一步调查,罪魁祸首确实是所使用的 Jetty 版本。 Request.getHeaderNames() 在两者之间的实现方式不同。
版本 7.6.16(我们碰巧在使用)使用原始类型枚举,造成严重破坏:
而码头版。 9.4.7 使用类型化枚举:
它解释了为什么我在原始问题中引用的 article 和 the other SO mention 都是正确的 - 它们只是指该方法的新实现。再次感谢@StuartMarks 的指出。
【讨论】:
看起来您链接到的getheaderNames()
的Android 版本返回一个原始类型 Enumeration
而不是Enumeration<Object>
。但效果是一样的;它会破坏类型推断,要求您在一个或另一个地方添加演员表才能使其工作。较新版本的 Jetty 返回 Enumeration<String>
,这使得示例无需强制转换即可正常工作。
那么,使用(Enumeration<String>)request.getHeaderNames()
来执行整个流操作而不是转换最终结果会更简洁。
@StuartMarks 有趣,我会考虑升级我们的 Jetty jar,也许这会像你说的那样工作。
@Holger:确实,这比铸造最终结果和/或升级 Jetty jars 更清洁和更明显的选择以上是关于在 Java 中将枚举转换为映射的主要内容,如果未能解决你的问题,请参考以下文章