Нет ничего необычного в том, чтобы иметь общий интерфейс в модульном программном обеспечении и адаптеры , чтобы соответствовать конкретным реализациям. Э.Г.
public class ConsumersTest {
List<String> generate(String input) {
ArrayList<String> output = new ArrayList<>();
generators.accept(input, output);
return output;
}
private static <T, U> BiConsumer<T, U> ignoreFirstArg(Consumer<U> consumer) {
return (t, u) -> consumer.accept(u);
}
private final BiConsumer<String, List<String>> generators =
Stream.<BiConsumer<String, List<String>>>of(
this::addFirstDependent,
ignoreFirstArg(this::addSecondIndependent)
).reduce(BiConsumer::andThen).orElse((arg1, arg2) -> {});
private void addFirstDependent(String input, List<String> output) {
if (input.contains("some string")) {
output.add("First-Dependent");
}
}
private void addSecondIndependent(List<String> output) {
output.add("Predefined Output");
}
}
Итак, ignoreFirstArg
- это общий адаптер для методов, не имеющих этого первого параметра. Может быть произвольное количество методов адаптера. Но учтите, что если адаптер очень специфичен и, таким образом, использует только один раз, можно также написать лямбда-выражение вместо ссылки на метод прямо в коде объединения. Обратите внимание, что я изменил этот код, чтобы не выполнять повторную оценку для каждого вызова generate(String input)
, так как в противном случае не было бы смысла объединять их, если вы не используете повторно комбинированную функцию, поскольку вы также можете использовать
List<String> generate(String input) {
ArrayList<String> output = new ArrayList<>();
Stream.<BiConsumer<String, List<String>>>of(
this::addFirstDependent,
ignoreFirstArg(this::addSecondIndependent)
).forEach(g -> g.accept(input, output));
return output;
}
или даже проще
List<String> generate(String input) {
ArrayList<String> output = new ArrayList<>();
this.addFirstDependent(input, output);
this.addSecondIndependent(output);
return output;
}
, который не хуже в обслуживании, чем функциональный код, так как каждый генератор состоит из одной строки.