gpt4 book ai didi

java - 如何组合来自 Collectors.groupingBy 的结果

转载 作者:行者123 更新时间:2023-12-03 19:39:52 30 4
gpt4 key购买 nike

我正在玩 Java 反射并学习更多关于 Stream.collect 的信息。
我有一个注释 MyTag,它有两个属性(idtype enum[Normal|Failure])。
此外,我有一个带有 MyTag 的带注释的方法列表,我能够使用 Collectors.groupingBy 通过 MyTag 注释的 id 属性对这些方法进行分组:

List<Method> ml = getMethodsAnnotatedWith(anClass.getClass(),
MyTag.class);
Map<String, List<Method>> map = ml.stream().collect(groupingBy(m -> {
var ann = m.getDeclaredAnnotation(MyTag.class);
return ann.anId();
}, TreeMap::new, toList()));

现在我需要将结果列表减少到一个对象,它只由两个相同 MyTag.id 的项目组成,一个带有 MyTag.type=Normal,另一个带有 MyTag.type=Failure。所以它会产生类似于 Map > 的结果。如果出现两次以上,我必须只选择第一个,记录并忽略其余的。
我怎么能做到这一点?

最佳答案

您可以使用

Map<String, Map<Type, Method>> map = Arrays.stream(anClass.getClass().getMethods())
.filter(m -> m.isAnnotationPresent(MyTag.class))
.collect(groupingBy(m -> m.getDeclaredAnnotation(MyTag.class).anId(),
TreeMap::new,
toMap(m -> m.getDeclaredAnnotation(MyTag.class).aType(),
m -> m, (first, last) -> first,
() -> new EnumMap<>(Type.class))));
结果将注释 ID 属性映射到 Map来自 Type (枚举常量 NORMALFAILURE )到第一个遇到的具有匹配注释的方法。虽然“first”在迭代反射发现的方法时没有实际意义,因为它不保证任何特定的顺序。 () -> new EnumMap<>(Type.class) map 工厂不是必需的,当您不指定工厂时,它也可以与默认使用的通用 map 一起使用。但是 EnumMap将处理您只有两个常量以稍微更有效的方式映射的情况,并且其迭代顺序将匹配枚举常量的声明顺序。
我认为, EnumMapPair<Method, Method>更好这需要记住哪些方法与“正常”相关,哪些与“失败”相关。适应两个以上的常量也更容易。另外, EnumMap是内置的,不需要第 3 方库。

关于java - 如何组合来自 Collectors.groupingBy 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66430837/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com