Collections 在Java中将枚举转换为映射

Collections 在Java中将枚举转换为映射,collections,java-8,functional-programming,java-stream,Collections,Java 8,Functional Programming,Java Stream,我试图在我的代码中使用以下表达式 Map<String, String> headersMap = Collections.list(request.getHeaderNames()) .stream() .collect(Collectors.toMap( name -> name, request::getHeader)); 地图标题地图= Collectio

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

    Map<String, String> headersMap =
             Collections.list(request.getHeaderNames())
        .stream()
        .collect(Collectors.toMap(
            name -> name,
            request::getHeader));
地图标题地图=
Collections.list(request.getHeaderNames())
.stream()
.collect(collector.toMap)(
名称->名称,
请求::getHeader);
如图所示 但Eclipse抱怨类型不匹配:

实现这一目标的正确方法是什么?为什么?为什么链接中的一个不使用任何铸造

更新:

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

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

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

与@Eugene的断言相反,这里的区别在于
org.eclipse.jetty.server.Request.getHeaderNames()
一个
枚举
,它因此被输入
集合.list()
导致一个
数组列表
,这就是Java编译器不接受它的原因

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

Map<String, String> headersMap =
 (Map<String, String>)
 Collections.list(request.getHeaderNames())
       .stream()
       .collect(Collectors.toMap(
                name -> name,
                request::getHeader));
地图标题地图=
(地图)
Collections.list(request.getHeaderNames())
.stream()
.collect(collector.toMap)(
名称->名称,
请求::getHeader);
显然,我提到(和)的页面使用的是原始方法,但没有最终将其转换为
Map
,因为@Eugene的建议,这些页面一开始就被破坏了,或者因为其他一些模糊的原因而工作

也许有人能解开这个谜

更新:

根据@StuartMarks的评论,经过进一步调查,罪魁祸首确实是正在使用的Jetty版本。两者的实现方式不同

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

鉴于Jetty ver。9.4.7使用类型化枚举:


它解释了为什么我在原始问题中引用的方法以及它们都是正确的——它们只是引用了该方法的新实现。再次感谢@StuartMarks指出它。

它的类型是
org.eclipse.jetty.server.Request
而不是
Request::getHeader
它应该是
name->Request.getHeader()
不知道。只是为了让它开心而草率的第一次尝试,也许有更好的方法?@Eugene no,
request::getHeader
name->request.getHeader(name)
的正确缩写,虽然从问题中不太清楚哪些类在使用,但这个问题忽略了一个关键的标记android,即不同的地方。在我的回答(之前)中,我刚刚选择了一个基于第一次谷歌搜索的类,这也是错误解释问题的原因。看起来像是链接到的Android版本的
getheaderNames()
返回了原始类型
枚举
,而不是
枚举
。但效果是一样的;它破坏了类型推断,需要在一个地方或另一个地方添加一个类型转换才能使其正常工作。Jetty return
Enumeration
的较新版本,使示例在不强制转换的情况下正常工作。然后,使用
(Enumeration)request.getHeaderNames()
,在不使用原始类型的情况下执行整个流操作,而不是强制转换最终结果,会更简洁。@StuartMarks,我会考虑升级我们的防波堤罐,也许这会像你说的那样起作用。@Holger:事实上,这比铸造最终结果和/或升级防波堤罐更干净、更明显