我有一个ArrayList<String>
,我需要遍历它,列表中的内容必须执行某些操作。我希望优化迭代和比较,可以做到吗?
我的代码:
Person
课程(包括getters
和setters
):
private String employeeID;
private String firstName;
private String lastName;
private String gender;
private String mobileNo;
private String emailID;
我的计算ArrayList
,myList- [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("");
}
}
答案 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, "");
}