我有一个接口,该接口有多种实现。每种接口类型只能有一种类型的实现,而我想收集每种类型的所有接口实现,即
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,而无需显式创建输出映射?
答案 0 :(得分:1)
分组后,您可以检查是否存在多个相同类型的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());