用Java将枚举转换为映射

时间:2019-02-13 02:10:14

标签: collections java-8 functional-programming java-stream

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

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

here所示 但是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 :(得分:1)

与@Eugene的断言相反,这里的区别在于org.eclipse.jetty.server.Request.getHeaderNames() producesEnumeration<Object>,因此被馈送到Collections.list()中会导致{{ 1}},这是Java编译器不接受它的原因。

按照IDE的建议将最终结果投射到ArrayList<Object>可以减轻投诉:

(Map<String, String>)

很明显,我提到的页面(hereServlet Filter: How to get all the headers from servletRequest?使用的是原始方法,但最终没有将其强制转换为Map<String, String> headersMap = (Map<String, String>) Collections.list(request.getHeaderNames()) .stream() .collect(Collectors.toMap( name -> name, request::getHeader)); ,这些页面从一开始就被破坏了(如@Eugene建议)由于其他一些晦涩的原因。

也许有人可以揭开这个谜。

更新

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

版本7.6.16(我们恰好在使用)使用原始类型的Enumeration,从而造成严重破坏:

enter image description here

而Jetty ver。 9.4.7使用类型化的枚举:

enter image description here

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