将方法转换为通用方法

Convert a method to a generic one

我创建了以下界面:

public interface ConverterInterface<T, S> {
    T convert(String id, S record, String event);
}

我所有的转换器 classes 都在实现这个。假设我有多个转换器 A、B、C、D...

对于实现此接口的每个 class,我都有一个非常相似的加载方法,如下所示:

private void loadA(String id, List<myObjA> objA, String event) {
    if (objA == null) {
        return;
    }

    // This is one class that implements that interface (I have multiple classes like this)
    MyConverterA converter = ...

    // Run over elements, call the converter and save it into an output list
    for (myObjA record : objA) {
        OUTPUT_LIST_A.add(converter.convertToEntity(id, record, event));
    }
}

private void loadB(...) { ... } 
private void loadC(...) { ... }

我的目标是将这几种加载方法转换为通用方法,以便我可以根据自己的输入使用相同的方法。

我正在尝试这样的事情:

private <S, T, V> void load (String id, List<S> data, T converter, List<V> output, String event) {
    if (data == null) {
        return;
    }

    for (S record: data) {
        // Here I need to call the convert method from the interface
        output.add()
    }
}

有什么想法吗?

谢谢!

如果你想传递列表:

private <S, T> void load (String id, List<S> data, ConverterInterface<T, S> converter, List<T> output, String event) {
    if (data == null)
        return;

    for (S record: data)
        output.add(converter.convert(id, record, event));
}

否则,如果你只传入输入,你可以使用 Stream API 和 map:

private <S, T> List<T> load (String id, List<S> data, ConverterInterface<T, S> converter, String event) {
    if (data == null)
        return Collections.emptyList();

    return data.stream()
        .map(record -> converter.convert(id, record, event))
        .collect(toList());
}

关键是你只需要两个泛型参数,ST 并且可以指定 Converter<S,T> 作为参数类型(如果需要可以添加方差)。