使用 Java 泛型的重构方法
Refactoring methods using Java generics
我有以下两种方法:
public void doStuffA(String str, List<ClassA> list){
list.stream()
.filter(s -> s.getObjValue().equalsIgnoreCase(str))
.findFirst()
.ifPresent( obj ->{
throw new RuntimeException();
});
}
public void doStuffB(String str, List<ClassB> list){
list.stream()
.filter(s -> s.getObjValue().equalsIgnoreCase(str))
.collect(Collectors.toList())
.findFirst()
.ifPresent( obj ->{
throw new RuntimeException();
});
}
ClassA和ClassB都有相同的getObjValue方法,但没有任何关系。它们不继承自公共 class 或接口。
由于这些方法几乎相同,我能否以某种方式使用泛型通过具有如下签名的方法对这段代码进行重复数据删除:
public void doStuffB(String str, List<?> list)
如果 classA 和 classB 不共享声明 String getObjValue()
.
的公共接口或超类,则不可能完全消除重复
我假设 doStuffB()
的第 3 行(阻止示例代码编译的 .collect(Collectors.toList())
行)可以安全地删除,这样 doStuffA()
和 doStuffB()
做同样的事情。
然后,您可以通过分解流处理并使用 Predicate
:
来减少大量重复
public void doStuffA(String str, List<ClassA> list) {
doStuff(str, list, s -> s.getObjValue().equalsIgnoreCase(str));
}
public void doStuffB(String str, List<ClassB> list) {
doStuff(str, list, s -> s.getObjValue().equalsIgnoreCase(str));
}
private <T> void doStuff(String str, List<T> list, Predicate<? super T> predicate) {
list.stream()
.filter(predicate)
.findFirst()
.ifPresent( obj -> {
throw new RuntimeException();
});
}
我有以下两种方法:
public void doStuffA(String str, List<ClassA> list){
list.stream()
.filter(s -> s.getObjValue().equalsIgnoreCase(str))
.findFirst()
.ifPresent( obj ->{
throw new RuntimeException();
});
}
public void doStuffB(String str, List<ClassB> list){
list.stream()
.filter(s -> s.getObjValue().equalsIgnoreCase(str))
.collect(Collectors.toList())
.findFirst()
.ifPresent( obj ->{
throw new RuntimeException();
});
}
ClassA和ClassB都有相同的getObjValue方法,但没有任何关系。它们不继承自公共 class 或接口。 由于这些方法几乎相同,我能否以某种方式使用泛型通过具有如下签名的方法对这段代码进行重复数据删除:
public void doStuffB(String str, List<?> list)
如果 classA 和 classB 不共享声明 String getObjValue()
.
我假设 doStuffB()
的第 3 行(阻止示例代码编译的 .collect(Collectors.toList())
行)可以安全地删除,这样 doStuffA()
和 doStuffB()
做同样的事情。
然后,您可以通过分解流处理并使用 Predicate
:
public void doStuffA(String str, List<ClassA> list) {
doStuff(str, list, s -> s.getObjValue().equalsIgnoreCase(str));
}
public void doStuffB(String str, List<ClassB> list) {
doStuff(str, list, s -> s.getObjValue().equalsIgnoreCase(str));
}
private <T> void doStuff(String str, List<T> list, Predicate<? super T> predicate) {
list.stream()
.filter(predicate)
.findFirst()
.ifPresent( obj -> {
throw new RuntimeException();
});
}