我正在使用谷歌的 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); }
添加回答
举报
0/150
提交
取消