Java for和if循环代码优化

时间:2016-02-03 09:29:18

标签: java if-statement for-loop optimization arraylist

我有一个ArrayList<String>,我需要遍历它,列表中的内容必须执行某些操作。我希望优化迭代和比较,可以做到吗?

我的代码:

Person课程(包括getterssetters):

private String employeeID;

private String firstName;

private String lastName;

private String gender;

private String mobileNo;

private String emailID;

我的计算ArrayListmyList- [firstName, gender, mobileNo, emailID]。如何优化下面显示的逻辑以避免这么多if条件?

Person p =new Person ();
for(String element:myList)
        {
       if("employeeid".equalsIgnoreCase(element))
            {
                p.setemployeeID("");
            }
       if("firstname".equalsIgnoreCase(element))
            {
                p.setfirstName("");
            }
       if("lastName".equalsIgnoreCase(element))
            {
                p.setlastName("");
            }
       if("gender".equalsIgnoreCase(element))
            {
                p.setgender("");
            }
       if("mobileno".equalsIgnoreCase(element))
            {
                p.setMobileNo("");
            }
       if("emailid".equalsIgnoreCase(element))
            {
                p.setEmailID("");
            }
        }

3 个答案:

答案 0 :(得分:3)

这里没有这么多,但是switch可能更美观。虽然您必须确保输入仅小写仅大写

for(String element:myList) {
    switch (element.toLowerCase()){
        case "employeeid": p.setemployeeID(""); break;
        case "firstname" : p.setfirstname(""); break;
        .
        .
        .

    }
}

如果您决定保留if设计,则一定要使用if-else,这样您就无需通过所有 if在每次迭代中都是如此。

作为最后一点,这可能不是设计你想要做的任何事情的最佳方式。您应该考虑一些更具OO性质的东西,比如在实例化Person对象时将Person对象的参数传递给构造函数。

编辑:我发现您要使用Enum,您可能希望实际定义它:

public enum MyEnum {
    EMPLOYEE_ID("employeeid"),
    FIRST_NAME("firstname")
    .
    .
    .
    ;

    private final String text;

    private MyEnum(final String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return text;
    }
}

答案 1 :(得分:3)

编译器能够将 switch 语句优化到查找表中,并在处理枚举时对文字执行编译时检查。 话虽这么说,你应该总是使用switch语句进行3次以上的比较。因此,您的代码变为 -

private static final String EMPLOYEE_ID = "employeeid";
private static final String FIRST_NAME = "firstname";
private static final String LAST_NAME = "lastName";
private static final String GENDER = "gender";
private static final String MOBILE_NO = "mobileno";
private static final String EMAIL_ID = "emailid";

Person p =new Person ();
for(String element: myList) {
switch (element.toLowerCase()) {
  case EMPLOYEE_ID: p.setemployeeID("");
    break;
  case FIRST_NAME: p.setfirstName("");
    break;
  case LAST_NAME: p.setlastName("");
    break;
  case GENDER: p.setgender("");
    break;
  case MOBILE_NO: p.setMobileNo("");
    break;
  case EMAIL_ID: p.setEmailID("");
    break;
}

}

答案 2 :(得分:0)

我没有测试,但是(如果字符串和方法名称相同)你可以使用反射,如下所示:

Person p = new Person();
for(String element : myList) {

    // method params
    Class[] paramTypes = new Class[1];
    paramTypes[0] = String.class;

    // method
    String methodName = "set" + element.indexOf(0,1).toUpperCase() + element.indexOf(1);
    Method m = c.getDeclaredMethod(methodName, paramTypes);

    // call method
    m.invoke(p, "");
}