Передайте функцию с выражением lamba, чтобы сделать обобщенную функцию - PullRequest
0 голосов
/ 21 сентября 2019

Я использую Google AutoValue для генерации некоторых конфигов, но перед генерацией конфигов я хотел бы убедиться, что записи очищены и значения по умолчанию добавлены в список.

Часть AutoValue выглядит следующим образом:

    @AutoValue.Builder
    public abstract static class Builder {
        public abstract Builder primaryName(List<String> value);

        public abstract Optional<List<String>> primaryName();

        public abstract Builder primaryTitle(List<String> value);

        abstract Optional<List<String>> primaryTitle();

        abstract Config autoBuild();

        public Config build() {

            normalizePriorities();
            EntitySourcePrioritizationConfig config = autoBuild();
            return config;
        }

У меня есть следующий код, который повторяется в normalizePriorities():

        private void normalizePriorities()
        {
            normalizeName();
            normalizeTitle();
        }

        private void normalizeName() {
            if (!primaryName().isPresent()) {
                primaryName(defaultPrimaryNames());
            } else {
                List<String> providedConfigEntries = primaryName().get();
                List<String> cleanConfig = sanitizeConfig(providedConfigEntries);
                primaryName(cleanConfig);
            }
        }

        private void normalizeTitle() {
            if (!primaryTitle().isPresent()) {
                primaryTitle(defaultPrimaryTitles());
            } else {
                List<String> providedConfigEntries = primaryTitle().get();
                List<String> cleanConfig = sanitizeConfig(providedConfigEntries);
                primaryTitle(cleanConfig);
            }
        }

Мне было интересно, как я могу использовать лямбда-выражения, чтобы уменьшить дедупликацию кода.

Имена и заголовки по умолчанию - это просто список строк, которые могут передаваться как параметры:

    public static ImmutableList<String> defaultPrimaryTitles() {
        return ImmutableList.of(
                "BBA",
                "TNN");
    }

    public static ImmutableList<String> defaultPrimaryNames() {
        return ImmutableList.of(
                "SNS Inc.",
                "ABC Corp.");
    }

Я попытался сгенерировать функцию следующим образом:

normalize(primaryAlias(), defaultPrimaryTitles());

private void normalize(Optional<List<String>> configList, List<String> defaultConfig){

...            
}

К сожалению, я не слишком уверен, как генерировать и передавать public abstract Builder primaryTitle(List<String> value) в метод.

1 Ответ

0 голосов
/ 21 сентября 2019

Вы можете передать Consumer , который принимает список строк и вызывает методы компоновщика, например:

Создайте получателя и передайте его методу normalize:

Consumer<List<String>> builderConsumer = (x) -> Builder.primaryName(x);
normalize(primaryAlias(), defaultPrimaryTitles(), builderConsumer);

И метод нормализации:

private void normalize(ImmutableList<String> configList, List<String> defaultConfig, Consumer<List<String>> builderConsumer) {
    List<String> cleanConfig = new ArrayList<>();
    // ...
    builderConsumer.accept(cleanConfig);
}
...