我有一个接收事物列表的方法,迭代列表并在每次迭代时执行XYZ操作。 " XYZ事物的定义"取决于实施或我想要实现的目标。 对于某些人,我只想运行一些命中数据库的SQL并更新客户名称和发票到期日期。对于其他人,我只想更新税额,过期天数等。情况总是不同的。我如何创建一个可重复使用的方法,而不是复制这个方法,而不是在#34; OnceAndOnlyOnce"。
的精神中。 DaoProvider daoProvider;
public void buildAndUpdateCustomer(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
//these are my XYZ things...
daoProvider.updateCustomerName();
daoProvider.updateAgingMia();
}
}
public void buildAndUpdateTax(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
daoProvider.updateTaxAmount();
}
}
public void buildAndUpdateLedgerBal(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
daoProvider.updateLedgerBalance();
}
}
答案 0 :(得分:1)
您可以将公共代码移动到私有帮助程序方法:
@SuppressWarnings("unchecked")
private static Map<String, Object> getArgs(Object obj) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
return args;
}
public void buildAndUpdateCustomer(List<Object> list) {
for (Object obj : list) {
Map<String, Object> args = getArgs(obj);
// these are my XYZ things...
daoProvider.updateCustomerName(args);
daoProvider.updateAgingMia(args);
}
}
public void buildAndUpdateTax(List<Object> list) {
for (Object obj : list) {
Map<String, Object> args = getArgs(obj);
daoProvider.updateTaxAmount(args);
}
}
public void buildAndUpdateLedgerBal(List<Object> list) {
for (Object obj : list) {
Map<String, Object> args = getArgs(obj);
daoProvider.updateLedgerBalance(args);
}
}
或者使用Java 8,您可以使用lambdas:
@SuppressWarnings("unchecked")
private static void buildAndUpdate(List<Object> list, Consumer<Map<String, Object>> consumer) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
consumer.accept(args);
}
}
public void buildAndUpdateCustomer(List<Object> list) {
buildAndUpdate(list, args -> {
daoProvider.updateCustomerName(args);
daoProvider.updateAgingMia(args);
});
}
public void buildAndUpdateTax(List<Object> list) {
buildAndUpdate(list, args -> daoProvider.updateTaxAmount(args));
}
public void buildAndUpdateLedgerBal(List<Object> list) {
buildAndUpdate(list, args -> daoProvider.updateLedgerBalance(args));
}
答案 1 :(得分:0)
我将假设args
需要传递给方法:
public void buildAndUpdateCustomer(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
//these are my XYZ things...
daoProvider.updateCustomerName(args);
daoProvider.updateAgingMia(args);
}
}
然后我们可以写一个方法:
public void buildAndProcess(List<Object> list, Consumer<Object> processor) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
processor.accept(args);
}
}
您之前的方法变为:
public void buildAndUpdateCustomer(List<Object> list) {
buildAndProcess(list, args -> {
//these are my XYZ things...
daoProvider.updateCustomerName(args);
daoProvider.updateAgingMia(args);
});
}
这段代码很奇怪:
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
与Map<String, Object> args = new HashMap<>((Map<String, Object>) obj);
我将重申我在评论中所说的内容:
只是嘲笑你的代码,你也可能Object
- Java是一种强类型语言,当有人有这么多Object
时,这是一个尖叫的红旗。一般来说,根本不应该看到Object
的大量使用
您似乎使用List<Object>
和Map<String, Object>
作为基本通用参数 - 这是一个非常讨厌的反模式,它删除了编译器提供的所有类型安全性,甚至删除了名称检查。