我如何抽象Java for循环的常见部分,以避免重复/重复

时间:2018-03-29 06:27:17

标签: java for-loop arraylist foreach iteration

我有一个接收事物列表的方法,迭代列表并在每次迭代时执行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();
    }
}

2 个答案:

答案 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>作为基本通用参数 - 这是一个非常讨厌的反模式,它删除了编译器提供的所有类型安全性,甚至删除了名称检查。