【发布时间】:2019-11-24 08:31:02
【问题描述】:
我有 2 个不同的对象,参数和变量,它们是上下文的字段。
我还有第三个对象:ParameterBase,它不是 Context 的一部分。
所有 3 个类都是自动生成的,我无法修改它们。
所有 3 个类都有 2 个字段:字符串类型的名称和值。
所有 3 个类都有 getter 和 setter。
我实现了以下方法:
public static List<ParametersBase> removeDuplicate(List<ParametersBase> parameterList) {
return new ArrayList<>(parameterList.stream().collect(
Collectors.toMap(
ParametersBase::getParamName,
Function.identity(),
Utils::mergeDuplicate
)
).values());
}
private static ParametersBase mergeDuplicate(ParametersBase a, ParametersBase b) {
if (a.getParamValue().equals(b.getParamValue())) {
return a;
} else {
throw new IllegalArgumentException("Error message");
}
}
我想对其他 2 个类使用此方法,所以我这样做了:
private static void removeDuplicatesParams(Context context) {
final List<ParametersBase> parameterList = emptyIfNull(
context.getParameters()).stream()
.map(parameter -> new ParametersBase()
.paramName(parameter.getParamName())
.paramValue(parameter.getParamValue()))
.collect(Collectors.toList());
List<ParametersBase> distinctParameterList = removeDuplicate(parameterList);
List<Parameter> distinctParametersList = distinctParameterList
.stream().map(temp -> new Parameter().paramName(temp.getParamName())
.paramValue(temp.getParamValue())).collect(Collectors.toList());
context.setParameters(distinctParametersList);
}
private static void removeDuplicatesVariables(Context context) {
final List<ParametersBase> parameterList = emptyIfNull(
context.getVariables()).stream()
.map(parameter -> new ParametersBase()
.paramName(parameter.getParamName())
.paramValue(parameter.getParamValue()))
.collect(Collectors.toList());
List<ParametersBase> distinctParameterList = removeDuplicate(parameterList);
List<Variable> distinctParametersList = distinctParameterList
.stream().map(temp -> new Variable().paramName(temp.getParamName())
.paramValue(temp.getParamValue())).collect(Collectors.toList());
context.setVariables(distinctParametersList);
}
如您所见,我创建的两个方法几乎相同,但由于我有 2 个自动生成的类,因此我必须复制代码。有没有办法让代码更漂亮?我正在使用 Java 8。
【问题讨论】:
-
据我了解,您可以使用泛型解决此问题。也许这个可以帮助你:stackoverflow.com/questions/58890600/…
-
@Hubi 这里的情况有点不同,因为这个问题涉及到复杂的对象,所以需要映射。
-
可以加
removeDuplicate方法源码吗?我觉得可以泛化。 -
public static List
removeDuplicate(List parameterList) { return new ArrayList(parameterList.stream().collect( Collectors.toMap(ParametersBase::getParamName, Function.identity( ), Utils::mergeDuplicate)) .values()); } 私有静态 ParametersBase mergeDuplicate(ParametersBase a, ParametersBase b) { if (a.getParamValue().equals(b.getParamValue())) { return a; } else { 抛出新异常(); } } @Bananon -
这三个类之间有继承关系吗?
标签: java oop object collections java-stream