我正在代码中尝试使用以下表达式
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中有更简洁的表达方式?
答案 0 :(得分:1)
与@Eugene的断言相反,这里的区别在于org.eclipse.jetty.server.Request.getHeaderNames()
produces和Enumeration<Object>
,因此被馈送到Collections.list()
中会导致{{ 1}},这是Java编译器不接受它的原因。
按照IDE的建议将最终结果投射到ArrayList<Object>
可以减轻投诉:
(Map<String, String>)
很明显,我提到的页面(here和Servlet 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,从而造成严重破坏:
而Jetty ver。 9.4.7使用类型化的枚举:
它解释了为什么我在原始问题中引用的article和the other SO mention都是正确的-它们只是引用了该方法的新实现。再次感谢@StuartMarks指出这一点。