如何使用流和收集器将通用对象列表转换为地图

How can I convert a list of Genric Objects into a Map using streams and collectors

我有 List 个具有通用类型的对象,我想使用流将其转换为 Map。但是我需要应用 resolver 来解析参数的类型。

代码:

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 函数中遇到错误:

The method toMap() in the type collectors is not applicable for the arguments

假设您提供的代码正确地完成了它的工作,这意味着源列表只包含每种类型的一个对象,您可以使用 Collectors.toMap(),如下面的代码所示。否则,您的 map.put() 将覆盖值,要解决冲突,您必须将第三个参数传递给 Collectors.toMap().

public Map<String, ABCClass<?>> getObjectBySimpleName(List<ABCClass<?>> listOfABC) {

    return listOfABC.stream()
            .collect(Collectors.toMap(val -> ((Class<?>) GenericTypeResolver.resolveTypeArgument(/*...*/))
                                                        .getSimpleName(),
                                      Function.identity()));
}

I am getting an error: The method toMap() in the type collectors is not applicable for the arguments

1. GenericTypeResolver.resolve...etc. .getSuperClass() 作为 keyMapper 函数传递给 Collectors.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. 您定义的映射类型为 Map<String,ABCClass<?>>,而 getSuperClass() 返回的类型与键 [=] 的类型不匹配20=] 并且您需要应用 getSimpleName() 来修复它。