传递一个带有lambda表达式的函数来创建一个泛型函数

我正在使用谷歌的 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);

            }

        }


我想知道如何使用 lambda 表达式来减少代码的重复数据删除。


默认名称和标题只是一个字符串列表,如下所示,可以作为参数传递:


    public static ImmutableList<String> defaultPrimaryTitles() {

        return ImmutableList.of(

                "BBA",

                "TNN");

    }


我尝试像这样泛化该函数:


normalize(primaryAlias(), defaultPrimaryTitles());


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


...            

}

不幸的是,我不太确定如何泛化并传递public abstract Builder primaryTitle(List<String> value)到该方法中。


当年话下
浏览 107回答 1
1回答

慕容森

您可以传递一个接受字符串列表并调用构建器方法的消费者,例如:创建消费者并将其传递给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); }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java