如何使用流和收集器将通用对象列表转换为映射
我有一个具有通用类型的对象的 List
,并希望使用流将其转换为 Map
。但我需要应用解析器来解析参数的类型。
代码:
private Map<String,ABCClass<?>> mapToCreate=new HashMap<>();
List<ABCClass<?>> listOfABC;
for(ABCClass<?> vals: listOfABC){
Class<?> typeArgument=((Class<?>) GenericTypeResolver.resolveTypeArgument(vals.getClass().getSuperClass(),ABCClass.class));
mapToCreate.put(typeArgument.getSimpleName(),vals);
}
我想通过使用收集器和流将上述代码转换为增强格式。是否可以?
我尝试了这个:
mapToCreate = listOfABC.stream()
.collect(Collectors.toMap(((Class<?>) GenericTypeResolver.resolveTypeArgument(listOfABC.getClass().getSuperClass(), ABCClass.class), listOfABC)));
我在 toMap 函数中收到以下行的错误:
类型收集器中的 toMap() 方法不适用于 论据
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设您提供的代码正确完成了工作,这意味着源列表每种类型仅包含一个对象,您可以使用
Collectors.toMap()
,如下面的代码所示。否则,您的map.put()
将覆盖值,并且要解决冲突,您必须将第三个参数传递到Collectors.toMap()
中。1.
GenericTypeResolver.resolve...etc。 .getSuperClass()
作为keyMapper
函数传递到Collectors.toMap()
,但它不是一个函数。正确的语法应该是这样的:x -> GenericTypeResolver.do(x)
。 (查看有关 lambda 表达式的教程)2. 您定义了
Map>
类型的映射,以及由getSuperClass()
与键String
的类型不匹配,您需要应用getSimpleName()
来修复它。Assuming that the code you've provided dose it's job correctly, it implies that the source list contains only one object per type, you can use
Collectors.toMap()
as shown in the code below. Otherwise, yourmap.put()
is overriding values, and to resolve collisions you have to pass the third argument intoCollectors.toMap()
.1.
GenericTypeResolver.resolve...etc. .getSuperClass()
is being passed as akeyMapper
function intoCollectors.toMap()
, but it's not a function. The correct syntax should be like this:x -> GenericTypeResolver.do(x)
. (take a look at this tutorial on lambda expressions)2. You defined the map being of type
Map<String,ABCClass<?>>
, and the type returned bygetSuperClass()
doesn't match the type of keyString
and you need to applygetSimpleName()
to fix it.