【问题标题】:Pass a function with lamba expression to make a generic function传递带有 lambda 表达式的函数以生成泛型函数
【发布时间】:2019-09-21 01:43:00
【问题描述】:

我正在使用 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);
            }
        }

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

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

    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&lt;String&gt; value) 生成并传递到方法中。

【问题讨论】:

  • public abstract Builder primaryTitle(List&lt;String&gt; value); 重载abstract Optional&lt;List&lt;String&gt;&gt; primaryTitle(); 有什么意义?它们的用途是什么?
  • 这就是 AutoValue 的工作原理:github.com/google/auto/blob/master/value/userguide/…

标签: java lambda refactoring generic-programming code-duplication


【解决方案1】:

您可以传递一个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);
}

【讨论】:

  • 非常感谢!我试图使用供应商,但我无法使参数生效。消费者起到了魅力!再次非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多