自动连接按类型键入的所有接口

时间:2019-11-27 01:28:38

标签: spring java-8

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

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,而无需显式创建输出映射?

1 个答案:

答案 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());