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

发布于 2025-01-14 12:59:38 字数 908 浏览 1 评论 0 原文

我有一个具有通用类型的对象的 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() 方法不适用于 论据

I have a List of objects that have a generic type and want to convert it into a Map using streams. But I need to apply resolver to resolve the type of the argument.

Code:

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);
}

I want to convert the above code into enhanced format by using collectors and streams. Is it possible?

I tried this:

mapToCreate = listOfABC.stream()
            .collect(Collectors.toMap(((Class<?>) GenericTypeResolver.resolveTypeArgument(listOfABC.getClass().getSuperClass(), ABCClass.class), listOfABC)));

I am getting an error in toMap function below line stating:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七七 2025-01-21 12:59:38

假设您提供的代码正确完成了工作,这意味着源列表每种类型仅包含一个对象,您可以使用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()));
}

我收到错误:类型收集器中的 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, your map.put() is overriding values, and to resolve collisions you have to pass the third argument into 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() is being passed as a keyMapper function into 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. You defined the map being of type Map<String,ABCClass<?>>, and the type returned by getSuperClass() doesn't match the type of key String and you need to apply getSimpleName() to fix it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文