为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

当年话下 2023-08-16 17:31:19
我正在使用谷歌的 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)到该方法中。
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

您可以传递一个接受字符串列表并调用构建器方法的消费者,例如:

创建消费者并将其传递给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);
}


查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信