gpt4 book ai didi

spring - Autowiring 按类型键入的所有接口(interface)

转载 作者:行者123 更新时间:2023-12-04 16:46:17 24 4
gpt4 key购买 nike

我有一个接口(interface),并且该接口(interface)有多种实现。每种接口(interface)类型只能有一种实现类型,我想收集每种类型的所有接口(interface)实现,即

Map<String, InterfaceExample>

public interface InterfaceExample {
String getType();
ClassA getClassA();
}

如果我必须填写此表格 Map<String, List<InterfaceExample>>我会通过以下方式完成:
@Autowired
private List<InterfaceExample> interfaceExamples;

@Bean
public Map<String, List<IntefaceExample>> getExamples() {
return interfaceExamples.stream()
.map(x -> new AbstractMap.SimpleEntry<>(x.getType(), x))
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
}

现在我必须确保每种类型只有一个实现,我可以通过以下方式进行:
@Bean
public Map<String, IntefaceExample> getExamples() {
Map<String, List<IntefaceExample>> examples = interfaceExamples.stream()
.map(x -> new AbstractMap.SimpleEntry<>(x.getType(), x))
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

Map<String, InterfaceExample> output = new HashMap<>();
examples.forEach((key, value) -> {
if(value.size() > 1) {
throw new RuntimeException("Wrongly configured!! ");
} else if(value.size() == 1) {
output.put(key, value.get(0));
}
});
return output;
}

是否有不同的方法来确保每种类型只有实现并以“流化方式”创建 bean 而无需显式创建输出映射?

最佳答案

groupingby 后可以检查是否有多个相同类型的 bean 并将它们收集到 List

List<InterfaceExample> res = interfaceExamples.stream().collect(Collectors.groupingBy(InterfaceExample::getType)).values()
.stream().map(value -> {
if (value.size() == 1) {
return value.get(0);
}
throw new RuntimeException("Wrongly configured!! ");
}).collect(Collectors.toList());

最好的方法是编写一个执行验证逻辑的自定义方法
public InterfaceExample conditionCheck(List<InterfaceExample> value) {
if (value.size() == 1) {
return value.get(0);
}
throw new RuntimeException("Wrongly configured!! ");
}

然后只需使用 stream
List<InterfaceExample> res = interfaceExamples.stream()
.collect(Collectors.groupingBy(InterfaceExample::getType))
.values()
.stream()
.map(this::conditionCheck)
.collect(Collectors.toList());

关于spring - Autowiring 按类型键入的所有接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59061759/

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