【发布时间】: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<String> value) 生成并传递到方法中。
【问题讨论】:
-
public abstract Builder primaryTitle(List<String> value);重载abstract Optional<List<String>> primaryTitle();有什么意义?它们的用途是什么? -
这就是 AutoValue 的工作原理:github.com/google/auto/blob/master/value/userguide/…
标签: java lambda refactoring generic-programming code-duplication