在Java中迭代列表并删除对象的内容
我有一个名为deleteFields的数组列表。 我有一个名为mergedDiffSRO的对象。 我必须删除mergedDiffSRO中存在于deleteFields中的所有字段在Java中迭代列表并删除对象的内容,java,arraylist,reflection,Java,Arraylist,Reflection,我有一个名为deleteFields的数组列表。 我有一个名为mergedDiffSRO的对象。 我必须删除mergedDiffSRO中存在于deleteFields中的所有字段 LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO(); public class LeadDetailsSRO{ private String emailId; private String emailByC
LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO();
public class LeadDetailsSRO{
private String emailId;
private String emailByCompany;
private int level;
private LeadObjects leadobj;
private String alternateNumber;
private String languagePreference;
private String kycName;
private String businessAs;
private String aadharName;
private String panName;
private String ovdName;
private String kycStatus;
private String aadhaarStatus;
private String panStatus;
private Set<String> ownershipTypeSet;
private String empId;
private String designation;
private Boolean nameMatchSuccess = null;
private String isSIMandatory;
}
List<String> deleteFields = new ArrayList<String>();
deleteFields.add("businessAs");
deleteFields.add("empId");
deleteFields.add("designation");
deleteFields.add("emailByCompany");
deleteFields.add("level");
deleteFields.add("ovdName");
leaddailssro mergedDiffSRO=新的leaddailssro();
公共类LeadDetailsRo{
私有字符串emailId;
私人公司;
私有整数级;
私人LeadObjects leadobj;
私有字符串交替枚举器;
私有字符串语言偏好;
私有字符串kycName;
私营企业;
私有字符串aadharName;
私有字符串名称;
私有字符串ovdName;
私有字符串kycStatus;
私有字符串aadhaarStatus;
私有字符串泛状态;
私有集所有者类型集;
私有字符串empId;
专用字符串指定;
私有布尔名称匹配成功=null;
私人字符串是强制性的;
}
List deleteFields=new ArrayList();
删除字段。添加(“业务”);
删除字段。添加(“empId”);
删除字段。添加(“名称”);
删除字段。添加(“emailByCompany”);
删除字段。添加(“级别”);
删除字段。添加(“ovdName”);
我如何进行同样的工作?
反射是否也同样适用?
请在JAVA中使用适当的代码提出一些解决方法,您可以通过反射来实现。但这是丑陋、缓慢和容易出错的。这就是:
LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO();
public class LeadDetailsSRO{
private String emailId;
private String emailByCompany;
private int level;
private LeadObjects leadobj;
private String alternateNumber;
private String languagePreference;
private String kycName;
private String businessAs;
private String aadharName;
private String panName;
private String ovdName;
private String kycStatus;
private String aadhaarStatus;
private String panStatus;
private Set<String> ownershipTypeSet;
private String empId;
private String designation;
private Boolean nameMatchSuccess = null;
private String isSIMandatory;
}
List<String> deleteFields = new ArrayList<String>();
deleteFields.add("businessAs");
deleteFields.add("empId");
deleteFields.add("designation");
deleteFields.add("emailByCompany");
deleteFields.add("level");
deleteFields.add("ovdName");
public void deleteFieldsByName(LeadDetailsSRO details, List<String> fieldNames) throws Exception {
for (String fieldName : fieldNames) {
Field field = LeadDetailsSRO.class.getDeclaredField(fieldName);
// this is usually not allowed at production settings
field.setAccessible(true);
Class fieldType = field.getType();
// the following if-else is ugly.
// But that's what we can do. We have to differentiate by classes.
if (fieldType.equals(String.class)) {
field.set(details, null);
} else if (fieldType.equals(Set.class)) {
field.set(details, new HashSet<>());
} else if (fieldType.toString().equals("int")) {
field.set(details, 0);
}
}
public void deleteFieldsByName(LeadDetailsRo details,List FieldName)引发异常{
for(字符串字段名:字段名){
Field Field=LeadDetailsRo.class.getDeclaredField(fieldName);
//这在生产设置中通常是不允许的
字段。setAccessible(true);
类fieldType=field.getType();
//下面这句话很难听。
//但这就是我们能做的。我们必须按类别来区分。
if(fieldType.equals(String.class)){
field.set(详细信息,空);
}else if(fieldType.equals(Set.class)){
field.set(详细信息,新HashSet());
}else if(fieldType.toString().equals(“int”)){
字段集(详细信息,0);
}
}
我建议你寻找其他类型的解决方案
使现代化
我们也可以在不进行反射的情况下完成。这仍然很难看,而且容易出错。但至少,它速度很快,而且在prod环境中也可以工作:
public class LeadDetailsSRO {
private String emailId;
private String emailByCompany;
private int level;
private String alternateNumber;
private String languagePreference;
private String kycName;
private String businessAs;
private String aadharName;
private String panName;
private String ovdName;
private String kycStatus;
private String aadhaarStatus;
private String panStatus;
private Set<String> ownershipTypeSet;
private String empId;
private String designation;
private Boolean nameMatchSuccess = null;
private String isSIMandatory;
public void deleteFields(List<String> fields) {
for (String fieldName : fields) {
switch (fieldName) {
case "emailId":
this.emailId = null;
break;
case "emailByCompany":
this.emailByCompany = null;
break;
// ...
}
}
}
}
公共类LeadDetailsRo{
私有字符串emailId;
私人公司;
私有整数级;
私有字符串交替枚举器;
私有字符串语言偏好;
私有字符串kycName;
私营企业;
私有字符串aadharName;
私有字符串名称;
私有字符串ovdName;
私有字符串kycStatus;
私有字符串aadhaarStatus;
私有字符串泛状态;
私有集所有者类型集;
私有字符串empId;
专用字符串指定;
私有布尔名称匹配成功=null;
私人字符串是强制性的;
公共无效删除字段(列表字段){
for(字符串字段名:字段){
交换机(字段名){
案例“emailId”:
this.emailId=null;
打破
案例“emailByCompany”:
this.emailByCompany=null;
打破
// ...
}
}
}
}
向我们展示您迄今为止尝试过的内容和/或一些显示数组列表和对象定义方式的代码。您可以向我们展示更多内容吗?例如,您迄今为止尝试过的示例代码。此外,示例输入和预期输出也会很有用。@joakim:我不知道如何继续,还没有尝试过任何内容!@tamas:sa此函数的MPE输入将与mergedDiffSRO对象和arraylist deleteFields相同。预期输出是与mergedDiffSRO属于同一类的对象,其中的字段不在对象中,并且在field@ankur43请尝试一下,让我们看看你有什么。没有代码示例,我们无法继续。如何处理类似于private LeadObjects leadobj的案例;请建议进行检查!