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 returnEnumeration
的较新版本,使示例在不强制转换的情况下正常工作。然后,使用(Enumeration)request.getHeaderNames()
,在不使用原始类型的情况下执行整个流操作,而不是强制转换最终结果,会更简洁。@StuartMarks,我会考虑升级我们的防波堤罐,也许这会像你说的那样起作用。@Holger:事实上,这比铸造最终结果和/或升级防波堤罐更干净、更明显